2015-02-08 161 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