2010-10-22 21 views
1

On m'a conseillé d'utiliser ce code pour faire ma méthode d'exécution après une période de temps définie, je l'ai modifié un peu et maintenant j'ai:Problèmes avec runnable

private Handler mHandler = new Handler(); 
private Runnable mUpdateTimeTask = new Runnable() { 
    public void run() { 
     final long start = mStartTime; 

     // Get the difference in ms 
     long millis = SystemClock.uptimeMillis() - start; 

     // Format to hours/minutes/seconds 
     int mTimeInSec = (int) (millis/1000); 

     // Do your thing 

     Location location = tracker.getLastKnownLocation(best); 
     RetrieveAvgPower(location); 

     // Update at the next second 
     mHandler.postAtTime(this, 1000);//start + ((mTimeInSec + 10) * 1000)); 
    } 
}; 

Et je tente de démarrer et arrêter avec:

public void onClick(View v) { 
     switch (v.getId()) { 
      case R.id.start: 
        mStartTime = System.currentTimeMillis(); 
        mHandler.removeCallbacks(mUpdateTimeTask); 
        mHandler.postDelayed(mUpdateTimeTask, 1000); 
        break; 
       case R.id.stop: 
        mHandler.removeCallbacks(mUpdateTimeTask); 
        break;}} 

Cependant, il y a un problème. Tout d'abord, ma méthode définit le texte et écrit une ligne dans le fichier journal, mais si j'utilise le code ci-dessus, le texte n'est pas défini, mais toutes les informations sont écrites automatiquement dans le fichier journal. Une autre chose est que je ne peux pas arrêter runnable - après qu'il commence à exécuter le programme semble ne pas répondre et se bloque si j'essaie d'appuyer sur le bouton d'arrêt. Qu'est-ce que je fais de mal et comment cela peut-il être résolu?

+0

Vous devez utiliser une asynctask – Falmarri

Répondre

2

La dernière ligne de run() ne devrait-elle pas appeler Handler.postDelayed() plutôt que Handler.postAtTime()? Selon la manière dont les files d'attente d'événements sont implémentées dans Android, vous risquez de tuer le thread en utilisant le mauvais ... vous définissez de manière répétée un Runnable à exécuter à 1 seconde après le démarrage du thread, donc pas d'autres événements arriver à courir.

1

Pour arrêter votre runnable vous pouvez ajouter quelque chose comme ceci:

class A implements Runnable 
{ 
private volatile boolean runTask = false; 

public void run() 
{ 
    runTask = true; 
    while(runTask) 
    { 
     // Do your thing 
     Thread.sleep(1000); // wait 1 second before "Do your thing" again 
    } 
} 


public void stop() 
{ 
    runTask = false; 
} 


} 

En ce qui concerne le texte ne mettre à jour que je ne comprenais pas très bien, est dans un IUG swing qui ne fixe pas?

EDIT Ajout d'un Thread.sleep (1000) à la fin de la méthode d'exécution

EDIT par les pairs: déplacé le Thread.Sleep (1000) de sorte que le Exécutable sera exécuté une fois par seconde jusqu'à ce que l'arrêt (au lieu de courir continuellement et attendre 1 seconde après avoir été arrêté).