【问题标题】:BroadcastReceiver: goAsync() vs AsyncTask in onReceive()BroadcastReceiver:goAsync() 与 onReceive() 中的 AsyncTask
【发布时间】:2016-07-08 07:59:24
【问题描述】:

我有一个BroadcastReceiver(或者,更具体地说,一个AppWidgetProvider),我需要在onReceive() 方法中执行一些网络操作...不是特别长时间运行(应该在10 秒内完成,并且如果没有,那么我很高兴(*)让他们超时)。

目前我正在从onReceive() 执行AsyncTask,这样网络操作就不会阻塞UI 线程,但我看到BroadcastReceiver 也提供了goAsync() 方法,显然几乎相同目的。

我正在努力寻找一个解释,说明在这种情况下使用 AsyncTaskgoAsync() 之间究竟有什么区别......你什么时候使用一个,什么时候使用另一个?

(*) 我提到我的网络操作和后续处理通常会在 BroadcastReceiver 被杀死之前(从onReceive() 返回之后)之前的 10 秒 (**) 内完成。但是,理想情况下,在特别具有挑战性的条件下(不可靠的网络、慢速设备)允许操作继续超过 10 秒会很好。在这方面,上述任何一种方法是否比另一种更好?至少对于goAsync(),文档建议您仍应在 10 秒内完成。但是对于AsyncTask,是否有可能产生AsyncTask 并让doInBackground() 方法运行超过10 秒......如果它被声明为静态内部,它是否会在BroadcastReceiver 的生命周期之外存在? BroadcastReceiver 的类?

(**) 编辑:10 秒的内容在 BroadcastReceiver.onReceive()... 的文档中,特别是:

当它在主线程上运行时,你永远不应该在其中执行长时间运行的操作(在考虑接收器被阻塞和候选者被杀死之前系统允许的超时时间为 10 秒)。

【问题讨论】:

  • 它在哪里说接收器在 10 秒后被“杀死”?
  • 我在帖子中添加了参考

标签: android multithreading android-asynctask broadcastreceiver


【解决方案1】:

receiver 中的 AsyncTask 是一个不好的做法,尽量避免它,因为系统可以杀死你的进程,onReceive 不保证它会返回。

goAsync() 返回一个PendingResult 对象, 系统认为接收者是活着的直到你调用PendingResult.finish()

【讨论】:

  • 那么,使用goAsync(),您可以让接收器保持活动状态超过 10 秒...基本上只要您需要完成操作?当然,可能仍有“期望”它应该在 10 秒内完成,但如果需要,您可以有更长的时间?关于AsyncTask...我曾认为,如果它被声明为静态内部类,那么它的生命就独立于父级(接收器),因此不应该在父级时被杀死?也许我需要找到一个关于这个主题的好教程......
  • @drmrbrewer 优点。我正在努力学习同样的东西。你有什么结论吗?
  • @PrimožKralj 我记得我坚持使用AsyncTask,但首先启动了Service,然后从那里启动了AsyncTask
【解决方案2】:

goAsync:

如果你在BroadcastReceiver::onReceive返回之前调用goAsync,当一段时间后有新的广播到来时,android系统会调用同一个receiver,就是你调用goAsync的同一个receiver实例

异步任务:

如果你在BroadcastReceiver::onReceive返回之前调用了AsyncTask,那么一段时间后有新的广播到来时,android系统可能会调用一个新的receiver,即使进程还在运行,你可能不会认为receiver是一样的上一个调用 AsyncTask 的地方

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-11-15
    • 1970-01-01
    • 2020-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-12
    • 1970-01-01
    相关资源
    最近更新 更多