我有一个小部件,需要在onUpdate()
中执行可能长时间运行的操作。仅执行操作就直接导致了ANR。为了解决这个问题,我的第一个尝试是在其中创建一个线程。我注意到在某些情况下该小部件不会得到更新。我的猜测是,一旦onUpdate()
退出,Android可能会杀死进程以及未完成的线程。
我的下一个尝试是创建一个意图服务。小部件的onUpdate()
刚刚启动了意图服务,该服务直接进行工作并在完成后更新小部件。这可行,但令我惊讶的是onHandleIntent()
是单线程的。如果我有两个小部件,然后都更新并启动了Intent服务,它们将依次更新...
这两个小部件的情况并不是很重要,但是我只是想知道这种模式的最佳实践。
为了解决两个小部件的情况,我最终在单击任何一个小部件实例时都使用相同的数据来更新它们。例如,我执行一次长时间运行的过程,并将结果应用于所有小部件实例。在我的情况下,这并不重要,但是对于许多小部件,不这样做可能很重要。
想法?
但令我惊讶的是,onHandleIntent()似乎是单线程的
是
如果我有两个小部件,然后都更新并启动了意图服务,它们将依次更新...
是
但是我只是想知道这种模式的最佳实践。
您的IntentService
是很好的正统解决方案,恕我直言。请记住,Android在运行速度慢的CPU上运行,而设备的RAM却很少。并行运行许多线程通常不是一个好主意。
然后,我开始在onHandleIntent()中启动一个线程,该线程需要唤醒锁,而且看起来变得太复杂了。
尝试我的WakefulIntentService
。
make onUpdate调用您自己的函数来循环浏览小部件并更新它们。在周期之前执行异步任务。您将需要两个单独的动作,一个要求更新开始,另一个WakefulIntentService
将广播以让小部件知道它们已完成。希望这会有所帮助。
IntentService