2010-10-06 9 views
4

quelqu'un peut-il me dire la meilleure façon de mettre à jour le widget chaque minute.Comment mettre à jour widget chaque minute

Maintenant, j'utilise thread dans le AppWidget, mais parfois je reçois erreur FAILED BINDER TRANSACTION !!! Après cette erreur, j'ai toujours eu beaucoup d'erreurs comme ça tout le temps et je ne peux pas changer la vue dans mon widget à nouveau.

Merci

+1

Vous ne pouvez pas insérer des threads en toute sécurité à partir d'un 'AppWidgetProvider' ou d'un autre 'BroadcastReceiver'. S'il vous plaît ne faites pas cela. – CommonsWare

Répondre

5

Plutôt que d'utiliser un fil dans le AppWidget, vous seraient mieux servis en utilisant le AlarmManager pour planifier une mise à jour du code intention qui AppWidget répéter gérerait de façon appropriée. Les avantages de cette approche est la possibilité de configurer le taux de mise à jour, et également gérer le cas de l'appareil en veille (et ne pas se réveiller pour exécuter votre code, ou même être bloqué de dormir parce que votre thread est occupé).

Il existe de nombreux examples sur Internet qui devraient expliquer les tenants et les aboutissants de l'utilisation d'AlarmManager pour élever vos intentions de mise à jour AppWidget.

+1

Il a aussi l'avantage de garder votre code hors de la RAM sauf quand c'est nécessaire. – CommonsWare

+0

J'utilise AlarmManager enfin c'est du travail .. thankssss – user430926

2

Le système envoie un événement de diffusion au début exact de chaque minute en fonction de l'horloge système. Créer un service avec votre widget et faire quelque chose comme ceci:

BroadcastReceiver _broadcastReceiver; 
private final SimpleDateFormat _sdfWatchTime = new SimpleDateFormat("HH:mm"); 
private TextView _tvTime; 

@Override 
public void onStart() { 
    super.onStart(); 
    _broadcastReceiver = new BroadcastReceiver() { 
      @Override 
      public void onReceive(Context ctx, Intent intent) { 
       if (intent.getAction().compareTo(Intent.ACTION_TIME_TICK) == 0) 
        _tvTime.setText(_sdfWatchTime.format(new Date())); 
      } 
     }; 

    registerReceiver(_broadcastReceiver, new IntentFilter(Intent.ACTION_TIME_TICK)); 
} 

@Override 
public void onStop() { 
    super.onStop(); 
    if (_broadcastReceiver != null) 
     unregisterReceiver(_broadcastReceiver); 
} 

Ne pas oublier cependant d'initialiser votre TextView au préalable (à l'heure du système actuel) car il est probable que vous sauteront votre interface utilisateur au milieu d'une minute et le TextView ne sera pas mis à jour jusqu'à la prochaine minute.

+0

Super! cela déclenche la mise à jour à l'horloge du système génial! Merci beaucoup – fullMoon

+0

comment puis-je obtenir un pointeur sur '_tvTime', dans le widget je n'ai qu'un' remoteview' et il définit le texte 'Textview's. – Mneckoee

Questions connexes