我得到了这种罕见的情况,我试图连接一个蓝牙插座到服务器和连接方法只是不会返回。下面是我的代码:
device = _adapter.getRemoteDevice(_address);
socket = device.createInsecureRfcommSocketToServiceRecord(_uuid);
_adapter.cancelDiscovery();
socket.connect();
这是在AsyncTask中运行,任务永远不会完成,因为连接永远被阻塞…这也可以防止重新连接到服务器(我还没有弄清楚是否我不能完全使用BT或只是不能使用相同的目标地址和UUID重新连接)。是否有一种方法来做连接与超时?
解决问题的一种方法是让另一个线程通过调用cancel(true)(这将中断AsyncTask线程)或通过调用Socket上的close()来中断AsyncTask。例如,它可以由主线程完成,通过在socket.connect()之前向其处理程序发布一个延迟的回调,并将在之后直接删除。
那么在你的例子中
post timeout callback to handler, with reference to socket or to this (AsyncTask)
try {
socket.connect();
} catch (IOException e) { // and/or InterruptedException
couldn't connect
} finally {
remove callback (this must be done here as the IO exception might be caused by something other than the timeout callback)
}