BroadcastReceiver:onReceive()

时间:2016-07-08 07:59:24

标签: android multithreading android-asynctask broadcastreceiver

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

目前我正在onReceive()执行AsyncTask,以便网络操作不会阻止UI线程,但我看到BroadcastReceiver也提供了AsyncTask goAsync()方法显然具有相同的目的。

我很难找到一个解释,说明在这种情况下使用goAsync()BroadcastReceiver之间的差异到底是什么时候?你何时使用一个,另一个?

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

(**)编辑:10秒的内容是BroadcastReceiver.onReceive()的文档...具体来说:

  

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

2 个答案:

答案 0 :(得分:2)

接收器中的AsyncTask是一种不好的做法,尽量避免使用它,因为系统可以终止你的进程而onReceive不能保证它的返回。

goAsync()返回PendingResult个对象, 系统会将接收器视为活动,直到您在其上调用PendingResult.finish()

答案 1 :(得分:0)

goAsync:

如果你在BroadcastReceiver :: onReceive返回之前调用goAsync,当一段时间后新的广播出现时,android系统会调用相同的接收者,只是调用goAsync的同一个接收者实例

的AsyncTask:

如果你在BroadcastReceiver :: onReceive返回之前调用AsyncTask,当一段时间后新的广播出现时,android系统可能会调用一个新的接收器,即使进程仍在运行,你可能不会认为接收器是相同的您调用AsyncTask的前一个