2010-11-29 12 views
3

Ich versuche, Arbeit eine selbstaktualisierende Funktionalität in einem Android-Widget zu machen, so einfach wie Ändern von zwei TextViews davon alle 10 Sekunden. Die ideale Lösung wäre, es dem Geist-Widget ähnlich zu machen (Nachrichten & Wetter). Und bis jetzt funktioniert es in Ordnung: Es wird alle 10 Sekunden über Handler.postDelayed's Runnable aktualisiert.Selbst-Aktualisierung alle 10 Sekunden widget Handler.postDelayed Problem

Runnable updateWidgetText = new Runnable() 
{ 
    @Override 
    public void run() { 
     if (screenEnabled) { 
      AppWidgetManager gm = AppWidgetManager.getInstance(ctx);       
      ComponentName thisWidget = new ComponentName(ctx,AnimeUndergroundWidget.class);   

      int index = (int)(REFRESH_COUNT % WIDGET_NEWS_TO_SHOW); 
      Noticia n = AUnder.single().getNoticiaByIndex(index); 
      if (n!=null) 
      { 
       last = n; 
       RemoteViews views = new RemoteViews(ctx.getPackageName(),R.layout.auwidget);  
       views.setTextViewText(R.id.widget_textview, n.getTitulo()); 
       views.setTextViewText(R.id.widget_textototal, n.getTexto().replace("\n", "")); 

       Intent clickintent = new Intent(INTENT_GO_TO_NEW); 
       PendingIntent pendingIntentClick = PendingIntent.getBroadcast(ctx, 0, clickintent, 0); 
       views.setOnClickPendingIntent(R.id.widget_fondo_titulo, pendingIntentClick); 

       Intent click2intent = new Intent(INTENT_GO_TO_NEW); 
       PendingIntent pendingIntentClick2 = PendingIntent.getBroadcast(ctx, 0, click2intent, 0); 
       views.setOnClickPendingIntent(R.id.widget_fondo_Texto, pendingIntentClick2); 

       gm.updateAppWidget(thisWidget, views); 
      } 
      REFRESH_COUNT++; 
     } 

     handler.removeCallbacks(this); 
     handler.postDelayed(this, WIDGET_REFRESH_TIME*1000); 
    } 
}; 

Die runnable wird zunächst im onUpdate Methode meiner Widget-Klasse ins Leben gerufen:

@Override 
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) { 

    ctx = context; 
    context.startService(new Intent(context, UpdateWidgetService.class)); 
    handler.postDelayed(updateWidgetText,WIDGET_REFRESH_TIME*1000); 
// here goes some more code, updating the views and refreshing click intents 
} 

Ich habe dies, falls jemand es nützlich findet.

Aber lassen Sie mich direkt auf den Punkt gehen: Wenn ich das Telefon aus dem Schlaf (auf dem Bildschirm), das Widget verrückt und beginnt die TextViews mit einem Fastforward-like-Effekt zu ändern. Ich nehme an, dass es ist, weil es einige post-Delay-Ereignisse in der Warteschlange gibt, oder sich in der updateAppWidget-Warteschlange befindet. Ich habe bereits einen Workaround mit dem hier gezeigten Code versucht: http://thinkandroid.wordpress.com/2010/01/24/handling-screen-off-and-screen-on-intents/ Sie können es in der ersten Code-Schnipsel sehen, ich überprüfe eine boolesche Variable, die Bildschirmstatus gespeichert hat, um postdislayed zu vermeiden, wenn der Bildschirm ausgeschaltet ist. Aber das scheint es nicht zu beheben.

Dieses Problem macht mich seit einer Woche verrückt, also frage ich aus Verzweiflung: Gibt es irgendeinen Weg, dies richtig zu machen?

+0

ich auch mit benutzerdefinierten Intents habe versucht, aber das Ergebnis ist das gleiche . Hat jemand dieses Problem gehabt, der FF-ähnliche Effekt? –

Antwort

2

Ihr postDelayed Anruf ist nicht in Ihrem if (screenEnabled) Block, so wird es weiterhin die Ereignisse selbst schreiben, wenn die screenEnabled falsch ist

+0

Ich kann nicht glauben, dass ich es nicht bemerkt habe ... –

Verwandte Themen