长时间运行的操作来更新Android appwidget

问题描述 投票:6回答:2

我有一个小部件,需要在onUpdate()中执行可能长时间运行的操作。仅执行操作就直接导致了ANR。为了解决这个问题,我的第一个尝试是在其中创建一个线程。我注意到在某些情况下该小部件不会得到更新。我的猜测是,一旦onUpdate()退出,Android可能会杀死进程以及未完成的线程。

我的下一个尝试是创建一个意图服务。小部件的onUpdate()刚刚启动了意图服务,该服务直接进行工作并在完成后更新小部件。这可行,但令我惊讶的是onHandleIntent()是单线程的。如果我有两个小部件,然后都更新并启动了Intent服务,它们将依次更新...

这两个小部件的情况并不是很重要,但是我只是想知道这种模式的最佳实践。

为了解决两个小部件的情况,我最终在单击任何一个小部件实例时都使用相同的数据来更新它们。例如,我执行一次长时间运行的过程,并将结果应用于所有小部件实例。在我的情况下,这并不重要,但是对于许多小部件,不这样做可能很重要。

想法?

android android-appwidget
2个回答
3
投票

但令我惊讶的是,onHandleIntent()似乎是单线程的

如果我有两个小部件,然后都更新并启动了意图服务,它们将依次更新...

但是我只是想知道这种模式的最佳实践。

您的IntentService是很好的正统解决方案,恕我直言。请记住,Android在运行速度慢的CPU上运行,而设备的RAM却很少。并行运行许多线程通常不是一个好主意。

然后,我开始在onHandleIntent()中启动一个线程,该线程需要唤醒锁,而且看起来变得太复杂了。

尝试我的WakefulIntentService


0
投票

make onUpdate调用您自己的函数来循环浏览小部件并更新它们。在周期之前执行异步任务。您将需要两个单独的动作,一个要求更新开始,另一个WakefulIntentService将广播以让小部件知道它们已完成。希望这会有所帮助。

IntentService
© www.soinside.com 2019 - 2024. All rights reserved.