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()为止.

相关文章

Android性能优化——之控件的优化 前面讲了图像的优化,接下...
前言 上一篇已经讲了如何实现textView中粗字体效果,里面主要...
最近项目重构,涉及到了数据库和文件下载,发现GreenDao这个...
WebView加载页面的两种方式 一、加载网络页面 加载网络页面,...
给APP全局设置字体主要分为两个方面来介绍 一、给原生界面设...
前言 最近UI大牛出了一版新的效果图,按照IOS的效果做的,页...