Problèmes avec runnable
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?
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é).