2014-03-04 32 views
0

再次需要你的幫助:我使用的是藍牙聊天例如通過Android和嘗試實施其等待來自處理器的答案的函數:多線程在Android中使用BluetoothChat:等待答案

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

尋找某種類型的監聽器類。 – Stunner

+0

如果你這樣做,這意味着你在不同的線程中讀寫你的布爾值 - 在這種情況下,它應該至少是'volatile' – fge

回答

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()一項新任務。

+0

+1好戲。:) –