Gestionnaire postDelayed et du Fil.sleep()
J'ai un fil.sommeil et un gestionnaire postDelayed dans mon code:
handler.postDelayed(new Runnable() {
@Override
public void run() {
Log.e(TAG, "I ran");
mIsDisconnect = false;
}
}, DISCONNECT_DELAY);
Après le code du gestionnaire et après que l'utilisateur presse le bouton, j'ai ceci:
while (mIsDisconnect) {
try {
Thread.sleep(DELAY);
} catch (InterruptedException e) {
Log.e(TAG, "problem sleeping");
}
}
Si l'utilisateur attends assez longtemps, je peux obtenir le "j'ai couru" dans mon journal. Mais si l'utilisateur presse le bouton avant l'expiration du délai, il semble que le postDelayed n'est jamais une chance de s'exécuter. Ma question est, est le fil.sleep() mess avec le gestionnaire de postDelayed?
Edit: Le but de ce code est que je veux continuer le programme seulement après DISCONNECT_DELAY secondes est déjà passée. Donc, si l'utilisateur clique au début, je dois attendre que le temps écoulé à la fin.
Thread.sleep
bloque les autres processus, alors que postDelayed
ne le fait pas.
OriginalL'auteur Jace | 2013-09-10
Vous devez vous connecter pour publier un commentaire.
Je suis en supposant que votre
handler
est associée avec le même fil à l'autre de la boucle est exécuté. (UnHandler
est associé au thread est créé.)postDelayed()
met leRunnable
dans le thread de gestion de la file d'attente de messages. Le message de la file d'attente est traitée lorsque le contrôle retourne au fil duLooper
.Thread.sleep()
bloque tout simplement le fil. Le contrôle ne permet pas de revenir à laLooper
et les messages ne peuvent pas être traitées. Dormir dans le thread de l'INTERFACE utilisateur est presque toujours tort.Pour accomplir ce que vous êtes en train de faire, retirez le sommeil et l'utiliser
postDelayed()
pour poster unRunnable
que les changements de votre application (comme vous le faites déjà en paramètre une variable de membremIsDisconnect
). Puis, dans laonClick()
il suffit de vérifier l'état d'application (mIsDisconnect
drapeau) si c'est ok pour continuer ou pas.OriginalL'auteur laalto
Je suppose que la deuxième section s'exécute sur le thread principal et vous n'avez pas à vous déplacer entre les threads.
Vous ne pouvez pas mettre le thread principal sur le sommeil, arrêter toutes les questions relatives à l'IU et d'autres choses qui doivent être exécutées sur ce thread (thread principal).
Utilisation
postDelayed
de la gestionnaire de la place.J'ai bien compris que. La première section n'arrivera pas si vous mettez le fil sur le sommeil. Encore une fois, éviter l'utilisation de 'Fil.sleep()'. Essayez de lire developer.android.com/reference/android/os/Handler.html. Vous pouvez ajouter ou supprimer des messages à partir du gestionnaire, peut-être que cela peut vous aider.
OriginalL'auteur Yaniv
La meilleure façon est avec une sentinelle:
OriginalL'auteur oskarko