我有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秒)。
答案 0 :(得分:2)
接收器中的AsyncTask是一种不好的做法,尽量避免使用它,因为系统可以终止你的进程而onReceive
不能保证它的返回。
goAsync()
返回PendingResult
个对象,
系统会将接收器视为活动,直到您在其上调用PendingResult.finish()
。
答案 1 :(得分:0)
goAsync:
如果你在BroadcastReceiver :: onReceive返回之前调用goAsync,当一段时间后新的广播出现时,android系统会调用相同的接收者,只是调用goAsync的同一个接收者实例
的AsyncTask:
如果你在BroadcastReceiver :: onReceive返回之前调用AsyncTask,当一段时间后新的广播出现时,android系统可能会调用一个新的接收器,即使进程仍在运行,你可能不会认为接收器是相同的您调用AsyncTask的前一个