再次需要你的帮助:我正在使用android的蓝牙聊天示例,并尝试实现一个等待处理程序答案的函数:
public void getOBD2Values() {
Log.d(TAG, "Before");
writeMessage("Hello");
mNastyBusyWait = true;
while(mNastyBusyWait){ //send Thread to sleep
try {
Thread.currentThread().sleep(500);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
Log.d(TAG, "After");
}
线程应该等到处理程序收到答案:
case MESSAGE_READ:
byte[] readBuf = (byte[]) msg.obj;
String readMessage = new String(readBuf, 0, msg.arg1);
mNastyBusyWait = false; // wake Thread up again
Log.d(TAG, "NOT IN IF :MESSAGE_READ: " + readMessage);
break;
这是一个愚蠢的忙等待方法来运行示例。 Afaik问题是线程等待,但处理程序是在同一个类,它永远不会用于继续......什么是更好的方法或如何解决这个问题?我终于从蓝牙客户端得到了答案!
感谢。
答案 0 :(得分:1)
如果这是“一次性”锁定,您可以使用CountDownLatch
:
// somewhere in init...
private final CountDownLatch latch = new CountDownLatch(1);
// waiting side...
writeMessage("hello");
latch.await();
Log.d(TAG, "After");
// waking side...
readMessage = ...;
latch.countDown();
Log.d(TAG, ...);
如果您想重复使用锁定,则必须使用Semaphore
。
另一种解决方案是在完成工作时使用Executor
和.submit()
新任务。