2011-12-22 18 views
8

siguiente situación:AsyncTask para actualizar el widget: ¿cómo acceder a textviews en onPostExecute()?

que tienen un app widget que según las encuestas de datos desde una URL y actualiza el widget con el parsed html. En dispositivos pre-honeycomb esto se puede hacer a través de un service sin usar un hilo separado. Ahora, en ICS, esto ha cambiado y es necesario un ASyncThread.

Para acceder a la TextViews en el Widget-Updater-Service utilizo

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

Pero esto no parece trabajar en un ASyncThread. ¿Podría ser que el servicio principal ya haya finalizado cuando el hilo intenta cambiar el textview?

¿Alguna idea sobre cómo resolver este problema?

+0

Tenga en cuenta que puede utilizar [StrictMode.ThreadPolicy] (http://developer.android.com/reference/android/ os/StrictMode.ThreadPolicy.html) cambia el comportamiento predeterminado en Android 3.0+, para seguir permitiendo que la operación de la red se ejecute en el hilo de la interfaz de usuario. – yorkw

+0

¿Puedes proporcionar más código? Estoy usando una AsyncTask para hacer algo similar y puedo ayudar. –

+0

No puedo comentar directamente ya que soy un nuevo usuario, pero lo puse en pastebin: http://pastebin.com/HQYaJBAm – skyworxx

Respuesta

-1

Tratando de llamar al método .setText en onpostexecute()

+1

no hay ningún método "findvaluebyid", así que no puedo usar setText para actualizar un widget – skyworxx

-1

Usar el siguiente método para actualizar su widget de aplicación:

appWidgetManager.updateAppWidget(appWidgetId, remoteViews); 
+0

El problema es "remoteViews", no puedo acceder a él desde un asyncthread – skyworxx

0

En mi opinión, el widget debe consumir sólo los datos que ya ha sido procesado y disponible de inmediato. Tal vez deberías llamar a un servicio para preparar esta información (a través de AsyncTask) y cuando todo el trabajo esté terminado, el servicio debe llamar al appWidgetManager.updateAppWidget. Pero eso es solo MHO.

3

Lo mejor es mantener su propio registro de RemoteView actualizado para cada appWidgetId para que sus BroadcastReceivers internos privados puedan actualizarlo . Puede usar AppWidgetManager.updateAppWidget() en cualquier momento no solo cuando obtiene el 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

Lo intenté su método para esto: http://stackoverflow.com/questions/20082315/using-json-to-match-a-string-with-todays-date pero sigo recibiendo un FC. – Si8

Cuestiones relacionadas