Нужно ли мне вызывать метод updateAppWidget AppWidgetManager из основного потока/потока пользовательского интерфейса?

Я прочитал руководство для разработчиков о виджетах приложений и понял, что во избежание ошибок ANR следует запустить службу в методе onUpdate вашего AppWidgetProvider для обновления виджеты... У меня вопрос по такому сервису: когда мы разрабатываем стандартные сервисы, которые можно запускать из активности, нам следует избегать слишком длинных вычислений в onStartCommand, так как onStartCommand< /em> выполняется в основном потоке пользовательского интерфейса. Итак, следует ли нам избегать длинных вычислений также внутри onStartCommand службы, запущенной AppWidgetProvider, или, в этом случае, мы не не рискуете заблокировать пользовательский интерфейс? Если мы должны избегать длинных вычислений в onStartCommand и в этом случае, можем ли мы запустить рабочий поток внутри службы или использовать Intent Service? В этом случае мы можем обновить виджет с помощью метода updateAppWidget AppWidgetManager из любого потока, который мы хотим, или мы рискуем обновить пользовательский интерфейс вне потока пользовательского интерфейса?

Надеюсь вопросы понятны..


person Gianni Costanzi    schedule 11.06.2012    source источник


Ответы (1)


Вы можете запустить службу Intent из onUpdate, а затем обновить виджет из службы с помощью AppWidgetManager, как обычно. Это не означает, что вы обновляете пользовательский интерфейс вне потока пользовательского интерфейса. Даже когда вы обновляете виджет из onUpdate, вы используете RemoteViews и AppWidgetManager, вы не обновляете пользовательский интерфейс напрямую. AppWidgetManager на самом деле вызывает внутреннюю службу Android, которая обновляет виджет, поэтому вам не нужно об этом беспокоиться.

Я думаю, что UI-нить для виджетов есть в лаунчере, но я не уверен. В любом случае код виджета не запускается в этом потоке, поэтому у нас есть RemoteViews.

person Ran    schedule 11.06.2012
comment
Спасибо за ответ. Кстати, если я использую не Intent Service, а Service, а затем я застрял в onStartCommand на несколько секунд, могу ли я рисковать ошибками ANR также в этом контексте? Документация onStartCommand рекомендует создавать другой поток для длительных действий, чего они не делают в [примере из Викисловаря]( code.google.com/p/wiktionary-android/source/browse/ trunk/), указанный в руководстве разработчика. - person Gianni Costanzi; 12.06.2012
comment
Есть идеи о возможном ANR, вызванном выполнением длительных ожиданий в методе onStartCommand вызываемой службы? - person Gianni Costanzi; 13.06.2012
comment
Как говорится в документе, код службы выполняется в потоке пользовательского интерфейса. Вы должны либо использовать IntentService и вы работаете в onHandleIntent(Intent), либо использовать обычный сервис и запустить свой собственный поток. - person Ran; 14.06.2012
comment
Итак, я понял это правильно, но пример был не очень хорошим... Они сказали не выполнять долгие ожидания и вычисления в методе поставщика виджетов onUpdate, вместо этого вызывать службу, а затем они показывают вам пример, который запускает службу и выполняет потенциально длинные вычисления в потоке пользовательского интерфейса.. они немного вводят в заблуждение.. кстати, спасибо - person Gianni Costanzi; 14.06.2012