Question

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:

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 d'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, mon texte de jeux de méthode 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 en cours d'écriture pour se connecter automatiquement le fichier. Une autre chose est que je ne peux pas arrêter runnable - après le début de programme d'exécution semble ne pas répondre et se bloque si je tente de bouton d'arrêt de la presse. Qu'est-ce que je fais mal et comment il peut être résolu?

Était-ce utile?

La solution

ne doit pas la dernière ligne de run() appel Handler.postDelayed() plutôt que Handler.postAtTime()?

Selon la façon dont les files d'attente d'événements sont mis en œuvre dans Android, vous pourriez être en train de tuer le fil en utilisant le mauvais ... vous êtes essentiellement à plusieurs reprises un Runnable mettre à courir à 1 seconde après le fil à l'origine a commencé, donc pas d'autres événements se à terme.

Autres conseils

Pour arrêter votre runnable vous pouvez simplement 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 mise à jour, je ne comprenais pas très bien, est-il dans une IUG swing qui ne fixe pas?

EDIT Ajout d'un Thread.sleep (1000) à la fin du procédé d'exécution

EDIT par les pairs: Déplacement du 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 en continu et puis d'attendre 1 seconde après avoir été arrêté).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top