2011-12-22 7 views
8

następującą sytuację:AsyncTask do aktualizowania widgetu - jak uzyskać dostęp do odsłon w onPostExecute()?

Mam app widget których dane ankiet z adresu URL i aktualizuje widget z parsed html. Na urządzeniach pre-honeycomb można to zrobić poprzez service bez używania osobnego wątku. Teraz, w przypadku ICS, sytuacja się zmieniła i konieczne jest wydanie ASyncThread.

Aby uzyskać dostęp do TextViews w Widget-Updater-Service używam

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

Ale to nie wydają pracę w ASyncThread. Czy to możliwe, że główna usługa została już zakończona, gdy wątek próbuje zmienić textview?

Wszelkie pomysły dotyczące rozwiązania tego problemu?

+0

Zauważ, że możesz użyć [StrictMode.ThreadPolicy] (http://developer.android.com/reference/android/ os/StrictMode.ThreadPolicy.html) zmień domyślne zachowanie w systemie Android 3.0+, aby zezwolić na działanie sieci działające w wątku UI. – yorkw

+0

czy możesz podać więcej kodu? Używam AsyncTask, aby zrobić coś podobnego i może być w stanie pomóc. –

+0

Nie mogę komentować bezpośrednio, ponieważ jestem nowym użytkownikiem, ale umieściłem go na pastebin: http://pastebin.com/HQYaJBAm – skyworxx

Odpowiedz

-1

Próba wywołania metody .setText w onpostexecute()

+1

nie ma metody "findvaluebyid", więc nie mogę użyć setText do aktualizacji widgetu – skyworxx

-1

zastosować następujący sposób zaktualizować swoją aplikację widżet:

appWidgetManager.updateAppWidget(appWidgetId, remoteViews); 
+0

Problem jest "remoteViews", nie mogę uzyskać do niego dostępu z asyncthread – skyworxx

0

Moim zdaniem, należy widget zużywa jedynie dane, które są już przetworzone i szybko dostępne. Może powinieneś zadzwonić do usługi, aby przygotować te dane (za pośrednictwem AsyncTask), a gdy cała praca zostanie wykonana, usługa powinna zadzwonić pod numer appWidgetManager.updateAppWidget. Ale to tylko MHO.

3

Najlepiej zachować własny rekord RemoteView do aktualizacji dla każdego appWidgetId, aby Twój prywatny wewnętrzny BroadcastReceivers mógł go zaktualizować. Możesz użyć AppWidgetManager.updateAppWidget() w dowolnym czasie , nie tylko wtedy, gdy masz intencję 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

próbowałem twoja metoda: http://stackoverflow.com/questions/20082315/using-json-to-match-a-string-with-todays-date, ale wciąż otrzymuję FC. – Si8

Powiązane problemy