2010-11-29 9 views
3

J'essaie de faire fonctionner une fonctionnalité de mise à jour automatique dans un widget Android, quelque chose de simple que de changer deux TextViews de celui-ci toutes les 10 secondes. La solution idéale serait de le rendre similaire au widget génie (nouvelles & météo). Et jusqu'à présent, cela fonctionne bien: il se met à jour toutes les 10 secondes via Runnable de Handler.postDelayed.Mise à jour automatique toutes les 10 secondes widget Handler.postDelayed problème

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); 
    } 
}; 

Le runnable est d'abord lancé dans la méthode onUpdate de ma classe Widget:

@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 
} 

Je mets cela au cas où quelqu'un juge utile. Mais permettez-moi d'aller droit au but: quand je décroche le téléphone (allume l'écran), le widget devient fou et commence à changer les TextViews avec un effet fastforward. Je suppose que c'est parce qu'il y a des événements postDelayed dans la file d'attente, ou peut-être dans la file d'attente updateAppWidget. J'ai déjà essayé une solution de contournement en utilisant le code affiché ici: http://thinkandroid.wordpress.com/2010/01/24/handling-screen-off-and-screen-on-intents/ Vous pouvez le voir dans le premier extrait de mon code, je vérifie une variable booléenne qui a stocké l'état de l'écran pour éviter d'utiliser postDelay lorsque l'écran est éteint. Mais cela ne semble pas le réparer.

Ce problème me rend fou depuis une semaine maintenant, alors je demande par désespoir: est-il possible de le faire correctement?

+0

J'ai aussi essayé avec Intentions personnalisés, mais le résultat est le même . Quelqu'un at-il eu ce problème, l'effet FF-like? –

Répondre

2

Votre appel postDelayed est pas dans votre cas bloc (screenEnabled), il continuera d'afficher les événements, même lorsque le screenEnabled est faux

+0

Je ne peux pas croire que je ne l'ai pas remarqué ... –

Questions connexes