android – BroadcastReceiver:goAsync()与onReceive()中的AsyncTask

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

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

我正在努力寻找一个解释,说明在这个上下文中使用AsyncTask和goAsync()之间究竟有什么区别……你什么时候使用它,什么时候使用另一个?

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

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

When it runs on the main thread you should never perform long-running operations in it (there is a timeout of 10 seconds that the system allows before considering the receiver to be blocked and a candidate to be killed).

最佳答案 接收器中的AsyncTask是一种不好的做法,尽量避免它,因为系统可以杀死你的进程而onReceive不保证它的返回.

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

点赞