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