2011-12-22 12 views
8

seguente situazione:AsyncTask per l'aggiornamento del widget: come accedere alle visualizzazioni di testo in onPostExecute()?

Ho un app widget che sondaggi i dati da un URL e aggiorna il widget con il parsed html. Sui dispositivi pre-honeycomb questo può essere fatto tramite un service senza usare un filo separato. Ora, su ICS, questo è cambiato e è necessario un ASyncThread.

Per accedere al TextViews nel Widget-Updater-Service io uso

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

Ma questo non sembra lavorare in un ASyncThread. Potrebbe essere, che il servizio principale è già stato terminato quando il thread sta cercando di cambiare il textview?

Qualche idea su come risolvere questo problema?

+0

noti che è possibile utilizzare [StrictMode.ThreadPolicy] (http://developer.android.com/reference/android/ os/StrictMode.ThreadPolicy.html) modifica il comportamento predefinito su Android 3.0+, per continuare a consentire l'esecuzione delle operazioni di rete sul thread dell'interfaccia utente. – yorkw

+0

puoi fornire altro codice? Sto usando un AsyncTask per fare qualcosa di simile e potrei essere in grado di aiutare. –

+0

Non posso commentare direttamente dal momento che sono un nuovo utente, ma l'ho inserito su pastebin: http://pastebin.com/HQYaJBAm – skyworxx

risposta

-1

Cercando di chiamare il metodo .setText in OnPostExecute()

+1

non esiste un metodo "findvaluebyid", quindi non posso usare setText per aggiornare un widget – skyworxx

-1

utilizzare il seguente metodo per aggiornare il widget di app:

appWidgetManager.updateAppWidget(appWidgetId, remoteViews); 
+0

Il problema è "remoteViews", non posso accedervi da un asyncthread – skyworxx

0

A mio parere, il widget dovrebbe consumare solo i dati che sono già trattati e prontamente disponibile. Forse dovresti chiamare un servizio per preparare questi dati (tramite AsyncTask) e quando tutto il lavoro è fatto, il servizio dovrebbe chiamare appWidgetManager.updateAppWidget. Ma questo è solo MHO.

3

Meglio mantenere il proprio record di RemoteView da aggiornare per ogni appWidgetId in modo che i propri BroadcastReceiver privati ​​interni possano aggiornarlo . Puoi utilizzare AppWidgetManager.updateAppWidget() a qualsiasi ora non solo quando ottieni l'intento 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

ho provato il tuo metodo per questo: http://stackoverflow.com/questions/20082315/using-json-to-match-a-string-with-todays-date ma continuo a ricevere un FC. – Si8

Problemi correlati