我正在尝试这样做:连接到USB设备并获得打开(或失败)连接。我是根据我所找到的例子和解释来做逻辑的,但我在等待批准时有问题。首先,我尝试了一种“很好”的方法来使用wait()+notifyAll(),而不是使用带有检查的简单循环,但两次等待方法(waitConnection())都阻塞了我给它的超时,直到消息被接收之后。所以我尝试了这两个版本。
因此,在这两种情况下,根据日志,waitConnection()方法(在startConnection()之后由使用者立即调用)似乎阻止了执行(我给了它超时10秒,它被阻塞了10秒),只有在它完成之后,BroadcastReceiver才会收到消息。看来requestPermission()不是异步的(正如我所想的那样),但是在这种情况下,startConnection()怎么可能在接收消息之前立即退出呢?我怎样才能等待BroadcastReceiver收到消息呢?如果我不使用waitConnection()方法,那么我的使用者应该如何知道何时才能开始检查连接可用性呢?
“只有在它完成后,BroadcastReceiver才会收到消息”
默认情况下,在主线程上调用
onReceived
回调。听起来你也在主线程上调用
waitConnection()
。由于
waitConnection()
阻塞,主线程在
waitConnection()
返回之前不能处理任何附加消息。这意味着在
onReceived
超时之前不会调用
waitConnection()
。
阻止主线程通常是个坏主意。 在这里读
相反,您可以让
onReceive
启动一个新的活动,然后做您需要做的任何事情,一旦您获得USB许可。这也许是最好的解决方案,也可能不是最好的解决方案,但无论如何,这里的关键是永远不要阻塞主线程。