gpt4 book ai didi

android - 在 Android 的 BluetoothSocket inputstream.read() 中实现超时

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:04:33 25 4
gpt4 key购买 nike

是否可以在 Android 中的 BluetoothSocket 的 inputstream.read() 函数中实现超时?

我试过使用 Thread.sleep() 但这只会暂停我的 Activity 。

---更新---

我有一个想法,在此处编写 2 个线程代码(t1 和 t2),其中每个线程中断其他线程,其中一个线程(t1)执行 sleep (5000)然后中断另一个线程(t2),从另一侧其他线程(t2)如果在读取输入流时检测到某些字符为 0x0D 会中断另一个线程(t1),但这是我的问题,有人可以帮助我吗?因为我没有使用线程的interrupt()方法,希望有人能帮帮我,谢谢...

---更新---



public void run(){
while(true){
try {
char r;
String respuesta = "";
while (true) {
r = (char) mmInStream.read();
respuesta += r;
if (r == 0x3e) {
break;
}
}
respuesta = respuesta.replaceAll(" ", "");
Log.d("respuesta", respuesta);
rHandler.obtainMessage(MESSAGE_READ, -1, -1, respuesta).sendToTarget();
} catch (IOException readException) {
Log.e("ServicioGeneral", "Error de lectura", readException);
this.interrupt();
connectionLost();
// posibly break();
}
}
}

这是我在不同线程中出现某些内容时的实现,问题是如果我没有从 de mmInStream 获取 0x3e 字符,将会达到超时。

我假设在第二个示例中我必须使用 notifyAll(),但是,我什么时候必须启动 readThread()?

谢谢你,@weeman

最佳答案

你可以这样做:

InputStream in = someBluetoothSocket.getInputStream();
int timeout = 0;
int maxTimeout = 8; // leads to a timeout of 2 seconds
int available = 0;

while((available = in.available()) == 0 && timeout < maxTimeout) {
timeout++;
// throws interrupted exception
Thread.sleep(250);
}

byte[] read = new byte[available];
in.read(read);

这样一来,您就可以在特定的超时时间内从流中进行初始读取。如果你想在阅读的任何时候实现超时,你可以尝试这样的事情:

Thread readThread = new ReadThread(); // being a thread you use to read from an InputStream
try {
synchronized (readThread) {
// edit: start readThread here
readThread.start();
readThread.wait(timeOutInMilliSeconds);
}
catch (InterruptedException e) {}

如果线程实际从输入流中读取某些内容,您可能需要某种事件处理程序来通知您的应用程序。

希望对您有所帮助!

----编辑:

我在不使用任何处理程序的情况下实现了一个示例。

Socket s = new Socket("localhost", 8080);
final InputStream in = s.getInputStream();

Thread readThread = new Thread(new Runnable() {
public void run() {
int read = 0;
try {
while((read = in.read()) >= 0) {
System.out.println(new String(new byte[]{ (byte) read }));
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});

synchronized (readThread) {
readThread.start();
try {
readThread.wait(2000);

if(readThread.isAlive()) {
// probably really not good practice!
in.close();
System.out.println("Timeout exceeded!");
}
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

}

关于android - 在 Android 的 BluetoothSocket inputstream.read() 中实现超时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10522767/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com