2016-01-14 3 views
1

Для того, чтобы обновить мой виджет из моего приложения, я использую этот кусок кода в AsyncTask:Обновление виджета из UI сделать UI замораживания

// REFRESH WIDGET 
int ids[] = AppWidgetManager.getInstance(MainActivity.getActivty().getApplication()).getAppWidgetIds(new ComponentName(MainActivity.getActivty().getApplication(), WidgetClass.class)); 
Intent intent = new Intent(MainActivity.getActivty(),WidgetClass.class); 
intent.setAction(AppWidgetManager.ACTION_APPWIDGET_UPDATE); 

// Use an array and EXTRA_APPWIDGET_IDS instead of AppWidgetManager.EXTRA_APPWIDGET_ID, 
// since it seems the onUpdate() is only fired on that: 
intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, ids); 
MainActivity.getActivty().sendBroadcast(intent); 

Это работает, за исключением того, что замораживает пользовательский интерфейс. Поскольку процесс в виджете занимает немного времени, это замораживание экрана в течение 1/2 секунд, а иногда и больше, чего я хочу избежать.

Использование этого в runnable приводит к такому же результату.

Есть ли способ обновить виджет из приложения без замораживания пользовательского интерфейса?

+0

Пожалуйста, напишите 'getAppWidgetIDs' функцию –

+0

Это собственный метод от AppWidgetanager.java, я не переопределяю это – Virthuss

+0

. Думаю, это проблема. Вы получаете идентификаторы из диспетчера виджетов системы. Если вы посмотрите на код AppWidgetManager.getAppWidgetIds, он использует некоторое приложение AppWidgetService для возврата идентификаторов. Думаю, это тяжелая задача. Вы должны изменить этот подход. –

ответ

0

Если вы хотите обновить Виджет TextView или весь View, который содержит много макетов и видов и т. Д., То вы можете просто использовать View.invalidate(), он обновит ваши представления.

Надеюсь, что это поможет.

+0

Существует вызов AsyncTask, поскольку он получает много данных из мой сервер перед обновлением самих представлений. Кроме того, как я могу получить идентификатор View? Особенно, если есть много экземпляров виджета? – Virthuss

+0

Если у вас много экземпляров виджета, тогда держите ссылки на виджет и когда вы хотите обновить итерацию по ссылкам и вызвать обновление для каждого экземпляра. –

+0

Дело в том, что некоторые виды должны оставаться, если сервер не смог получить данные с сервера; однако invalidate() будет очищать все. Это, к сожалению, не работает над моим делом ... – Virthuss

Смежные вопросы