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」事件甚至會導致應用程序掛起。
但是,我不知道上面的代碼是什麼錯誤。我不確定它是否導致了任何同步問題?如何改進流程以消除潛在的懸掛問題。任何形式的建議都非常感謝。謝謝。
我只需要關閉mmSocket,讀取失敗後不需要顯式關閉mInStream發生?它似乎如果我不打電話mInStream.close(),一些Android手機不會正確釋放資源,並需要重新啓動手機再次估計連接。無論如何,我不知道處理斷開連接事件的最正確方法,高度讚賞你的幫助。 – manhon 2015-02-09 16:56:03
mInStream是套接字的InputStream的引用。如果mInStream.read()失敗,則意味着流被關閉或發生IOexception。在你的情況下,關閉這樣做的套接字:「關閉對象並釋放它所擁有的任何系統資源」,如果你看到Android源代碼,你可以在close方法中看到這個「mSocket.shutdownInput();」如果你繼續在源代碼中看到這個方法會「關閉這個套接字的輸入流」,所以當你關閉套接字時你不必自己關閉inputStream =) – 2015-02-09 17:23:46