【问题标题】:BroadcastReceiver asynchronous onReceiveBroadcastReceiver 异步 onReceive
【发布时间】:2013-10-02 14:51:45
【问题描述】:

正如标题所说,有没有办法异步运行BroadcastReceiver onReceive() 方法?

基于其实现,android 在主线程上运行onReceive() 方法。

我正在使用BroadcastReceiver 明确请求与 USB 设备通信的权限。当请求权限对话框获得权限时,会调用onReceive() 方法,但由于它在主线程上运行,因此无法(至少,我不知道)在完成时发出信号。对布尔标志进行轮询会阻塞主线程,这反过来又会阻止调用onReceive() 方法。

是否有异步调用onReceive() 的方法,或者是否有另一种方法来显式(不使用清单中的意图过滤器)请求权限并连接到 USB 设备?

编辑:我希望方法阻塞,直到获得许可并建立连接。

【问题讨论】:

    标签: android usb broadcastreceiver


    【解决方案1】:

    你可以有你想要的部分异步行为。

    从 Honeycomb 开始,您可以拨打goAsync(),然后您有 10 秒左右的时间异步完成您的工作。

    用法示例可显示here

    【讨论】:

      【解决方案2】:

      您可以在广播接收器的 onReceive 中发送广播。广播 Intent 可以在 Activity 的生命周期方法中注册,也可以在其中注销。

      【讨论】:

      • 是的,这是一个解决方案,但是(请参阅编辑)我想阻止,直到获得许可。
      • "当请求权限对话框收到权限后,调用onReceive()方法"。是不是你的receiver在获得权限后才收到广播?
      • 是的,这是正确的,当获得许可时,UsbManager 广播PendingIndent 并且接收者调用onReceive() 并检查意图额外内容。但这在主线程上运行。
      • 你总是可以在 onReceive 方法中启动一个新线程并立即返回。
      • 但是在同步期间(使用信号量)主线程会阻塞,onReceive() 永远不会被调用。
      【解决方案3】:

      首先,你不应该做任何阻塞主线程的事情。其次,除非你使用registerReceiver(BroadcastReceiver, IntentFilter, String, Handler),否则你永远不应该在BroadcastReceiver.onReceive 中做任何需要花费大量时间的事情,因为它很可能会在10 秒后被杀死(参见documentation for BroadcastReceiver)。您应该从onReceive 方法启动AsyncTask 或单独的线程。如果您想在 USB 设备连接之前停止与 UI 的其余部分交互,请不要阻塞主线程。显式禁用某些东西或切换到一些简单的片段或活动,其中包含加载 GIF 或除阻塞之外的任何内容。在主线程上阻塞会导致弹出等待或杀死系统对话框,并且没有用户选择等待。

      您的问题的简单答案是使用registerReceiver 以编程方式注册接收器,而不是使用清单,但我必须先提供一些免责声明。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多