2015-02-08 168 views
0

我正在編程一個藍牙設備。我發現當我嘗試斷開連接時,該應用將掛起一些設備。安卓藍牙如何斷開連接而沒有掛起

public class ConnectionThread extends Thread { 
.... 
@Override 
public void run() { 

    bReading = true; 
    while (bReading) { 
     try { 
      if (mInStream==null) break; 
      bytes = mInStream.read(buffer); 

     } catch (IOException e) { 
      cancel(); 
      break; 
     } 
    } 
} 

public void cancel() { 
    bReading = false; 
    if (mInStream != null) { 
     try { 
      mInStream.close(); 
     } catch (Exception e) {   
      e.printStackTrace(); 
     } 
     mInStream = null; 
    } 

所以我調用取消功能來停止while循環。 對於上面的邏輯,會有「線程死亡」事件,這是不好的。對於某些設備,「thead dead」事件甚至會導致應用程序掛起。

但是,我不知道上面的代碼是什麼錯誤。我不確定它是否導致了任何同步問題?如何改進流程以消除潛在的懸掛問題。任何形式的建議都非常感謝。謝謝。

回答

0

要停止通信,你可以關閉套接字:

while (true) { 
    try { 
     if (mInStream==null) break; 
     bytes = mInStream.read(buffer); 

    } catch (IOException e) { 
     break; 
    } 
} 

public void cancel(){ 
    try{ 
     mmSocket.close(); 
     if(DEBUG_MODE){ 
      Log.i(TAG, "socket closed"); 
     } 
    }catch(IOException e){ 
     Log.e(TAG, "socket close failed", e); 
    } 
} 

當socket關閉循環會自然分解,因爲讀取失敗

+0

我只需要關閉mmSocket,讀取失敗後不需要顯式關閉mInStream發生?它似乎如果我不打電話mInStream.close(),一些Android手機不會正確釋放資源,並需要重新啓動手機再次估計連接。無論如何,我不知道處理斷開連接事件的最正確方法,高度讚賞你的幫助。 – manhon 2015-02-09 16:56:03

+0

mInStream是套接字的InputStream的引用。如果mInStream.read()失敗,則意味着流被關閉或發生IOexception。在你的情況下,關閉這樣做的套接字:「關閉對象並釋放它所擁有的任何系統資源」,如果你看到Android源代碼,你可以在close方法中看到這個「mSocket.shutdownInput();」如果你繼續在源代碼中看到這個方法會「關閉這個套接字的輸入流」,所以當你關閉套接字時你不必自己關閉inputStream =) – 2015-02-09 17:23:46