AsyncTask для обновления виджета - как получить доступ к текстовым представлениям в onPostExecute ()? - PullRequest
8 голосов
/ 23 декабря 2011

Следующая ситуация:

У меня есть app widget, который опрашивает данные с URL-адреса и обновляет виджет с помощью parsed html. На устройствах pre-honeycomb это можно сделать через service без использования отдельного потока. Теперь в ICS это изменилось, и необходимо ASyncThread.

Для доступа к TextViews в Widget-Updater-Service я использую

RemoteViews remoteViews = new RemoteViews(getApplicationContext().getPackageName(), R.layout.widget_layout);
remoteViews.setTextViewText(R.id.TextView1,"test"); 

Но это не похоже на работу в ASyncThread. Может ли быть так, что основной сервис уже был прерван, когда поток пытается изменить textview?

Есть идеи по решению этой проблемы?

Ответы [ 4 ]

3 голосов
/ 31 мая 2013

Лучше всего вести собственную запись RemoteView, которая будет обновляться для каждого appWidgetId, чтобы ваши частные внутренние BroadcastReceivers могли обнови это. Вы можете использовать AppWidgetManager.updateAppWidget () в любом время не только тогда, когда вы получаете намерение ACTION_UPDATE.

Widget.java:

@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
    RemoteViews remoteViews;
    ComponentName watchWidget;

    remoteViews = new RemoteViews(context.getPackageName(), R.layout.widget_layout);
    watchWidget = new ComponentName(context, Widget.class);

    // onUpdate is called every xx seconds.
    // trigger fetch from the server!
    FetchTask fetchTask = new FetchTask();
    fetchTask.appWidgetManager = appWidgetManager;
    fetchTask.remoteViews = remoteViews;
    fetchTask.watchWidget = watchWidget;

    fetchTask.execute(PHONE_NUMBERSURL);
}

FetchTask.java:

class FetchTask extends AsyncTask<String, Integer, List<String>> {

    protected List<String> doInBackground(String... urls) {
        List<String> Sent = new ArrayList<String>();
        return Sent;
    }

    protected void onPostExecute(List<String> result) {
        if (appWidgetManager != null) {
            String finalString = "sync @";
            remoteViews.setTextViewText(R.id.sync_textView, finalString);
            appWidgetManager.updateAppWidget(watchWidget, remoteViews);
        }
    }

}
0 голосов
/ 23 декабря 2011

Используйте следующий метод для обновления виджета приложения:

appWidgetManager.updateAppWidget(appWidgetId, remoteViews);
0 голосов
/ 16 мая 2013

На мой взгляд, виджет должен потреблять только те данные, которые уже обработаны и оперативно доступны.Возможно, вам следует позвонить в службу для подготовки этих данных (через AsyncTask), и когда вся работа будет выполнена, служба должна вызвать appWidgetManager.updateAppWidget.Но это только MHO.

0 голосов
/ 23 декабря 2011

Попытка вызова метода .setText в onpostexecute ()

...