Android BluetoothSocket连接超时问题

3

我遇到了一个罕见的情况,即我尝试将BluetoothSocket连接到服务器,但connect方法却无法返回。这是我的代码:

            device = _adapter.getRemoteDevice(_address);
            socket = device.createInsecureRfcommSocketToServiceRecord(_uuid);                           
            _adapter.cancelDiscovery();
            socket.connect();

这是在AsyncTask中运行的,任务永远不会结束,因为连接被永远阻塞...这也导致无法重新连接到服务器(我还没弄清楚是否完全不能使用BT,还是只不能使用相同的目标地址和UUID重新连接)。有没有一种方法可以使用超时进行连接?

1个回答

2

解决问题的一种方法是通过另一个线程调用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)
}

这很好,我之前也考虑过...但在我看来并不是很优雅。我想知道是否有更好的解决方案-例如全局套接字选项或类似的东西。 - smichak

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接