使用BluetoothChat在Android中进行多线程处理:等待回答

时间:2014-03-04 09:39:40

标签: java android multithreading

再次需要你的帮助:我正在使用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问题是线程等待,但处理程序是在同一个类,它永远不会用于继续......什么是更好的方法或如何解决这个问题?我终于从蓝牙客户端得到了答案!

感谢。

1 个答案:

答案 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()新任务。