¿Cómo puedo actualizar correctamente AppWidget?

Soy un noob a android y estoy teniendo problemas para actualizar un appwidget. Es un widget de noticias que muestra texto diferente cada 20 segundos. No tengo ningún problema conseguir el texto cambiar y exhibir correctamente cuando el widget se inicializa. Sin embargo, después de cada 30 minutos de actualización del widget mi array widgetID int retiene el int que existía antes de la actualización. Así que después de cada actualización el widget muestra datos antiguos y nuevos. ¿Hay un para borrar el widget ID int matriz de datos antiguos durante el proceso de actualización. Cualquier ayuda es muy apreciada.

Mi código:

allWidgetIds2 = appWidgetManager.getAppWidgetIds(thisWidget); 

Método para cambiar el texto en el widget. Esto funciona bien inicialmente, pero después de la actualización muestra datos antiguos junto con nuevos datos …

  public void updateStory() { tickerheadline = RssReader.rssheadline.get(storyCounter); tickerstory = RssReader.rssstory.get(storyCounter); remoteViews.setTextViewText(R.id.headline, tickerheadline ); remoteViews.setTextViewText(R.id.story, tickerstory ); if (storyCounter==RssReader.rssheadline.size()-1){ storyCounter = 0; storyCounter++; }else{ storyCounter++; } appWidgetManager.updateAppWidget(allWidgetIds, remoteViews); //Log.e("Widget", allWidgetIds.toString()); mHandler.postDelayed(new Runnable() { public void run() { updateStory(); } } ,20000); } } 

EDITAR

 public void updateStory() { //Added appWidgetManager = AppWidgetManager.getInstance(this.getApplicationContext()); ComponentName thisWidget = new ComponentName(getApplicationContext(),MyWidgetProvider.class); remoteViews = new RemoteViews(this.getApplicationContext().getPackageName(),R.layout.widget1); tickerheadline = RssReader.rssheadline.get(storyCounter); tickerstory = RssReader.rssstory.get(storyCounter); remoteViews.setTextViewText(R.id.headline, tickerheadline ); remoteViews.setTextViewText(R.id.story, tickerstory ); if (storyCounter==RssReader.rssheadline.size()-1){ storyCounter = 0; storyCounter++; }else{ storyCounter++; } appWidgetManager.updateAppWidget(thisWidget, remoteViews); //appWidgetManager.updateAppWidget(allWidgetIds, remoteViews); //Log.e("Widget", allWidgetIds.toString()); mHandler.postDelayed(new Runnable() { public void run() { updateStory(); } } ,20000); } } 

Aunque puede ser muy inteligente con AppWidgets en android en términos de actualización y así sucesivamente, la forma más fácil de ponerse en marcha es simplemente reconstruir el contenido del widget cada vez que se actualiza. Como usted está refrescando solamente cada 30 minutos, no hay mucha razón de preocuparse sobre uso de la CPU.

Por lo tanto, yo sugeriría hacer una reconstrucción estándar cada vez que activar una actualización utilizando el enfoque estándar. El código que tienes arriba, mientras que parece correcto, no fuerza realmente una actualización, mucho más limpio comenzar de rasguño. Una vez que está funcionando, entonces si usted puede hacer que sea más ligero, dime cómo!

 // You need to provide: // myContext - the Context it is being run in. // R.layout.widget - the xml layout of the widget // All the content to put in it (duh!) // Widget.class - the class for the widget RemoteViews rv= new RemoteViews(myContext.getPackageName(), R.layout.widget); rv.setXXXXXXX // as per normal using most recent data set. AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(myContext); // If you know the App Widget Id use this: appWidgetManager.updateAppWidget(appWidgetId, rv); // Or to update all your widgets with the same contents: ComponentName projectWidget = new ComponentName(myContext, Widget.class); appWidgetManager.updateAppWidget(projectWidget, rv); 

A menudo, el enfoque más fácil (en mi opinión) es envolver esto en una WidgetUpdater.class que usted llama desde un servicio o directamente usando una llamada de alarma de tiempo. Usando onUpdate es generalmente una mala idea porque fuerza el teléfono en el modo de energía completa y no es muy controlable. Nunca he logrado hacer que funcione. Mucho mejor hacer algo como:

  Intent myIntent = // As per your onUpdate Code alarmPendingIntent = PendingIntent.getService(context, 0, myIntent, PendingIntent.FLAG_ONE_SHOT); // ... using the alarm manager mechanism. AlarmManager alarmManager = (AlarmManager)getSystemService(ALARM_SERVICE); alarmManager.set(AlarmManager.RTC_WAKEUP, nextUpdateTimeMillis, alarmPendingIntent); 
  • Java cómo incrementar un int 1 cada segundo hasta que llegue a 15
  • Cómo convertir int a typedarray Android
  • ¿Por qué Android utiliza Ints en vez de Enums?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.