微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐