Je veux faire une pause entre deux lignes de code, laissez-moi vous expliquer un peu:
-> l'utilisateur clique sur un bouton (une carte en fait) et je le montre en changeant l'arrière-plan de ce bouton:
thisbutton.setBackgroundResource(R.drawable.icon);
-> après disons 1 seconde, je dois revenir à l'état précédent du bouton en modifiant son arrière-plan:
thisbutton.setBackgroundResource(R.drawable.defaultcard);
-> J'ai essayé de suspendre le thread entre ces deux lignes de code avec:
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Cependant, cela ne fonctionne pas. C'est peut-être le processus et non le fil que je dois interrompre?
J'ai aussi essayé (mais ça ne marche pas):
new Reminder(5);
Avec ça:
public class Reminder {
Timer timer;
public Reminder(int seconds) {
timer = new Timer();
timer.schedule(new RemindTask(), seconds*1000);
}
class RemindTask extends TimerTask {
public void run() {
System.out.format("Time's up!%n");
timer.cancel(); //Terminate the timer thread
}
}
}
Comment puis-je suspendre / dormir le fil ou le processus?
android
process
multithreading
Hubert
la source
la source
(!conditionCheck()) {}
est généralement découragé.Réponses:
Une solution à ce problème consiste à utiliser la méthode Handler.postDelayed () . Certains supports de formation Google suggèrent la même solution.
Cependant, certains ont souligné que la solution ci-dessus provoque une fuite de mémoire car elle utilise une classe interne et anonyme non statique qui contient implicitement une référence à sa classe externe, l'activité. Il s'agit d'un problème lorsque le contexte d'activité est récupéré.
Une solution plus complexe qui évite la fuite de mémoire sous-classe les
Handler
etRunnable
avec les classes internes statiques à l'intérieur de l'activité car les classes internes statiques ne contiennent pas de référence implicite à leur classe externe:Notez que le
Runnable
utilise une WeakReference à l'activité, qui est nécessaire dans une classe statique qui a besoin d'accéder à l'interface utilisateur.la source
final Button mynewbutton = mybutton;
et l'utilisermynewbutton
dans le gestionnaire et le Runnable à partir de là.Vous pouvez essayer celui-ci il est court
AVERTISSEMENT : ne faites jamais cela sur un thread d'interface utilisateur.
Utilisez-le pour dormir, par exemple. fil de fond.
La solution complète pour votre problème sera: Ceci est disponible API 1
Sans créer de gestionnaire tmp. Cette solution est également meilleure que @tronman car nous ne conservons pas la vue par le gestionnaire. Nous n'avons pas non plus de problème avec le gestionnaire créé sur un mauvais thread;)
Documentation
Code pour la classe postDelayed from View:
la source
OMG of course do this in background thread
n'est pas pertinent, sauf si vous montrez COMMENT le mettre en arrière-plan. À ce moment, vous découvrirez que vous avez une réponse plus compliquée que la réponse déjà acceptée. Ai-je mentionné qu'une meilleure solution a été acceptée il y a trois ans? : PHandler + postRunnable
accomplit tout cela, en une seule étape. Sans la surcharge du système de créer un deuxième thread.J'utilise ceci:
la source
e.getLocalizedMessage()
faire?Handler/postDelayed
solution acceptée présente deux avantages: (1) évite la surcharge système du 2e thread, (1) s'exécute sur le thread d'interface utilisateur, et peut donc effectuer des changements d'interface sans provoquer d'exception.Vous ne voulez probablement pas le faire de cette façon. En mettant un explicite
sleep()
dans votre gestionnaire d'événements cliqué sur un bouton, vous verrouillez réellement l'interface utilisateur entière pendant une seconde. Une alternative consiste à utiliser une sorte de minuterie à un coup . Créez une TimerTask pour redonner à la couleur d'arrière-plan la couleur par défaut et planifiez-la sur la minuterie.Une autre possibilité consiste à utiliser un gestionnaire . Il y a un tutoriel sur quelqu'un qui est passé de l'utilisation d'une minuterie à l'utilisation d'un gestionnaire.
Soit dit en passant, vous ne pouvez pas suspendre un processus. Un processus Java (ou Android) a au moins 1 thread et vous ne pouvez mettre en veille que les threads.
la source
J'utilise CountDownTime
la source
C'est ce que j'ai fait à la fin de la journée - fonctionne bien maintenant:
la source
En plus des réponses de M. Yankowsky, vous pouvez également utiliser
postDelayed()
. Celui-ci est disponible sur toutView
(par exemple, votre carte) et prend unRunnable
et un délai Il exécuteRunnable
après ce délai.la source
Ceci est mon exemple
Créer un Java Utils
la source
Ou vous pouvez utiliser:
ce qui a l'avantage de ne pas nécessiter d'emballage
try ... catch
.la source
Si vous utilisez Kotlin et coroutines , vous pouvez simplement faire
Et si vous devez mettre à jour l'interface utilisateur
la source
Je sais que c'est un vieux fil, mais dans la documentation Android j'ai trouvé une solution qui fonctionnait très bien pour moi ...
https://developer.android.com/reference/android/os/CountDownTimer.html
J'espère que cela aide quelqu'un ...
la source
Et pour être sûr que vous pouvez le combiner avec la méthode de la "classe statique" comme décrit dans la réponse tronman
la source