【问题标题】:Do I need to call updateAppWidget method of AppWidgetManager from the main/UI thread?我是否需要从主/UI 线程调用 AppWidgetManager 的 updateAppWidget 方法?
【发布时间】:2012-06-11 19:53:17
【问题描述】:

我已经阅读了关于 App Widgets 的开发人员指南,并且我明白为了避免 ANR 错误,您应该在 AppWidgetProvideronUpdate 方法中启动服务更新小部件...我有一个关于此类服务的问题:当我们开发可以从活动启动的标准服务时,我们应该避免在 onStartCommand 中进行过长的计算,因为 onStartCommand 方法在主 UI 线程中运行。所以,我们是否应该避免在由 AppWidgetProvider 启动的服务的 onStartCommand 内或在此如果我们不冒险阻止用户界面?如果在这种情况下我们也必须避免在 onStartCommand 中进行长时间计算,我们是否可以在服务中启动工作线程,或者使用 Intent 服务?在这种情况下,我们可以使用 AppWidgetManagerupdateAppWidget 方法从我们想要的任何线程更新小部件,还是冒着从 UI 线程外部更新 UI 的风险?

我希望问题很清楚..

【问题讨论】:

    标签: android widget android-service android-appwidget appwidgetprovider


    【解决方案1】:

    您可以从 onUpdate 启动 Intent 服务,然后像往常一样使用 AppWidgetManager 从服务更新小部件。这并不意味着您要在 UI 线程之外更新 UI。即使您从 onUpdate 更新小部件,您使用的是 RemoteViews 和 AppWidgetManager,您也不会直接更新 UI。 AppWidgetManager 实际上调用了一个内部的 Android 服务来更新小部件,所以你不必担心它。

    我认为小部件的 UI 线程在启动器中,但我不确定。在任何情况下,小部件的代码都不会在那个线程上运行,这就是我们有 RemoteViews 的原因。

    【讨论】:

    • 感谢您的回答..顺便说一句,如果我不使用 Intent 服务而是使用服务,然后我在 onStartCommand 中卡住了几秒钟,我会在这种情况下也有风险 ANR 错误? onStartCommand 的文档建议您为长时间活动生成另一个线程,这不是他们在开发人员指南中引用的 [Wictionary 示例](code.google.com/p/wiktionary-android/source/browse/trunk/…) 中所做的......
    • 关于在被调用服务的 onStartCommand 方法中执行长时间等待可能导致 ANR 的任何想法?
    • 正如文档所说,服务代码在 UI 线程中运行。您应该使用 IntentService 并在 onHandleIntent(Intent) 中工作,或者使用常规服务并启动您自己的线程。
    • 所以我理解正确,但是这个例子不太好......他们说“不要在小部件提供者 onUpdate 方法中执行长时间等待和计算,而是调用服务”,然后他们向您展示了一个启动服务并在 UI 线程中执行可能很长的计算的示例。它们有点误导......顺便说一句,谢谢
    猜你喜欢
    • 2017-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-16
    相关资源
    最近更新 更多