0

我读过开发者了解应用小工具引导,我已经了解,以避免ANR错误,你应该开始你的AppWidgetProvider 的onUpdate方法中的服务更新部件......我有个问题关于这样的服务:当我们开发可以从一个活动开始的标准服务时,我们应该在onStartCommand中避免过长的计算,因为onStartCommand方法在主UI线程中运行..所以,我们应该避免长时间计算还内服务的onStartCommand开始由的AppWidgetProvider或在这种情况下,我们不会冒险阻挡UI?如果我们必须避免在这种情况下onStartCommand也长计算,我们可以开始一个工作线程的服务中,或使用一个Intent服务?在这种情况下,我们可以更新与我们想还是我们的风险,从UI线程以外更新UI线程的任何AppWidgetManagerupdateAppWidget方法的窗口小部件?我是否需要从主/ UI线程调用AppWidgetManager的updateAppWidget方法?

我希望这些问题是很清楚..

回答

1

可以启动从一个的onUpdate意图服务,然后更新使用AppWidgetManager照常服务的小部件。这并不意味着你要在UI线程之外更新UI。即使当你从onUpdate更新一个小部件时,你正在使用RemoteViews和AppWidgetManager,你并没有直接更新UI。 AppWidgetManager实际上调用了一个更新小部件的内部Android服务,所以你不必担心它。

我认为,小部件的UI线程是在发射器,但我不知道。无论如何,widget的代码不会在该线程上运行,这就是为什么我们有RemoteViews。

+0

感谢您的答案..顺便说一句,如果我不使用意向服务,但一个服务,然后我卡在* onStartCommand *几秒钟,我在这种情况下还会冒ANR错误吗? * onStartCommand *的文档建议您为长期活动产生另一个线程,这不是他们在[Wictionary示例]中所做的(http://code.google.com/p/wiktionary-android/source/browse/trunk /Wiktionary/src/com/example/android/wiktionary/WordWidget.java)。 –

+0

任何有关在被调用的服务的* onStartCommand *方法中执行长时间等待所导致的可能的ANR的想法? –

+1

就像文档所说,服务代码在UI线程中运行。您应该使用IntentService,并使用'onHandleIntent(Intent)'工作或使用常规服务并启动您自己的线程。 – Ran

相关问题