Android - AppWidgets、AlarmManager 和 AsyncTask

标签 android android-asynctask broadcastreceiver alarmmanager android-appwidget

我在使用 AlarmManager 生成的广播更新应用小部件方面运气不佳。这就是我所做的:

AppWidgetProvider#onEnabled上初始化AlarmManager

AlarmManager alarms = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
alarms.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, 
SystemClock.elapsedRealtime(), 60000, pendingIntent);

我还定义了 BroadcastReceiver,它仅监听 AlarmManager 触发的更新。当更新被触发时,代码运行AsyncTask来进行网络调用。当 AsyncTask 完成 (onPostExecute) 时,它使用之前获得的 AppWidgetManager 实例来更新小部件。

实际上一切都运行良好,直到我在日志中看到消息,之后 AlarmManager 再也不会触发另一个更新:

Process com.foo.myapp (pid 12345) has died

我是否需要进行某种检查来重新启动警报?例如,当用户访问小部件的父应用程序时?如果我的应用程序在请求过程中终止,如何确保我可以完成长时间运行的任务并返回到小部件?

最佳答案

When update is fired code runs AsyncTask that makes a network call.

如果这是在 BroadcastReceiver 内部,则不起作用。您无法从 BroadcastReceiver 安全地 fork 线程,而 AsyncTask 可以有效地 fork 线程以异步方式执行其任务。

相反,您应该将长时间运行的工作委托(delegate)给 service started from the alarm 广播接收器

关于Android - AppWidgets、AlarmManager 和 AsyncTask,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1864153/

相关文章:

Android 可以将共享首选项用于登录目的

java - 重复代码行的替代方案(Android/Java)

android - Android 中的 TypeArray - 如何在 xml 中存储自定义对象并检索它们?

java - 使用 AsyncTask 获取 JSON 时,ProgressDialog 永远不会被关闭

android - 从新类中获取内部类

android - fragment 和广播接收器

java - Android - 广播接收器未被解雇

android - 根据帐户设置调用的顺序未调用 SyncAdapter

java - Android 迭代列表-MapView

android - 用户离开 Activity 后如何接收已发送/已发送的个人短信的反馈