J'ai une variable dans mon code qui dit que c'est "status".
Je souhaite afficher du texte dans l'application en fonction de cette valeur de variable. Cela doit être fait avec un délai spécifique.
C'est comme,
Vérifier la valeur de la variable d'état
Afficher du texte
Attendez 10 secondes
Vérifier la valeur de la variable d'état
Afficher du texte
Attendez 15 secondes
etc. Le délai peut varier et il est défini une fois le texte affiché.
J'ai essayé Thread.sleep(time delay)
et ça a échoué. Une meilleure façon de faire cela?
android
android-thread
Kalpa Pathum Welivitigoda
la source
la source
Réponses:
Vous devez utiliser
Handler
lapostDelayed
fonction de dans ce but. Il exécutera votre code avec un délai spécifié sur le thread d'interface utilisateur principal, vous pourrez donc mettre à jour les contrôles d'interface utilisateur.la source
Pour toute personne intéressée, voici une classe que j'ai créée en utilisant le code d'inazaruk qui crée tout le nécessaire (je l'ai appelé UIUpdater parce que je l'utilise pour mettre à jour périodiquement l'interface utilisateur, mais vous pouvez l'appeler comme vous voulez):
Vous pouvez ensuite créer un objet UIUpdater dans votre classe et l'utiliser comme ceci:
Si vous souhaitez l'utiliser comme programme de mise à jour d'activité, placez l'appel de démarrage dans la méthode onResume () et l'appel d'arrêt dans onPause (), afin que les mises à jour démarrent et s'arrêtent en fonction de la visibilité de l'activité.
la source
UPDATE_INTERVAL = interval;
doit être avantthis(uiUpdater);
dansUIUpdater(Runnable uiUpdater, int interval)
(car la valeur deUPDATE_INTERVAL
est utilisée et doit être celle transmise comme paramètreinterval;
). Évitez également la largeur de plus de 80 caractères dans le code lorsque cela est possible (presque toujours;)new Handler(Looper.getMainLooper())
. Deuxièmement, il ne valide pas les arguments, il avale donc les Runnables nuls et les intervalles négatifs. Enfin, il ne prend pas en compte le temps passé sur lauiUpdater.run()
ligne, ni ne gère les éventuelles exceptions levées par cette méthode. De plus, il n'est pas sûr pour les threads, vous devez créerstart
etstop
synchroniser des méthodes.error: call to this must be first statement in constructor
il existe peut - être une solution simple.Je pense que la nouveauté est d'utiliser un ScheduledThreadPoolExecutor . Ainsi:
la source
Executors.newSingleThreadScheduledExecutor()
peut être une autre option ici.La minuterie fonctionne bien. Ici, j'utilise Timer pour rechercher du texte après 1.5s et mettre à jour l'interface utilisateur. J'espère que cela pourra aider.
la source
Il y a 3 façons de procéder:
Utiliser ScheduledThreadPoolExecutor
Un peu exagéré car vous n'avez pas besoin d'un pool de Thread
Utiliser la tâche du minuteur
Ancien style Android
Utilisez Handler et Runnable
Style Android moderne
Gestionnaire non-fuite avec activité / contexte
Déclarez une classe Handler interne qui ne fuit pas de mémoire dans votre classe Activity / Fragment
Déclarez un exécutable qui effectuera votre tâche répétitive dans votre classe Activité / Fragment
Initialiser l'objet Handler dans votre activité / fragment (ici FlashActivity est ma classe d'activité)
Pour répéter une tâche après un intervalle de temps fixe
Pour arrêter la répétition de la tâche
MISE À JOUR: À Kotlin:
la source
La minuterie est une autre façon de faire votre travail, mais assurez-vous d'ajouter
runOnUiThread
si vous travaillez avec l'interface utilisateur.et xml est ...
Planifiez un compte à rebours jusqu'à une date ultérieure, avec des notifications régulières à intervalles réguliers. Exemple d'affichage d'un compte à rebours de 30 secondes dans un champ de texte:
Pour plus de détails
la source
Essayez l'exemple suivant, cela fonctionne !!!
Utilisez [Handler] dans la méthode onCreate () qui utilise la méthode postDelayed () qui provoque l'ajout de Runnable à la file d'attente des messages, à exécuter après la durée spécifiée qui est de 0 dans l'exemple donné. 1
Référez-vous à ce code:
la source
Vous pouvez utiliser un gestionnaire pour publier du code exécutable. Cette technique est très bien décrite ici: https://guides.codepath.com/android/Repeating-Periodic-Tasks
la source
Sur la base du post ci-dessus concernant le ScheduledThreadPoolExecutor , j'ai trouvé un utilitaire qui correspondait à mes besoins (je voulais lancer une méthode toutes les 3 secondes):
la source
Dans mon cas, j'ai dû exécuter un processus si l'une de ces conditions était vraie: si un processus précédent était terminé ou si 5 secondes s'étaient déjà écoulées. J'ai donc fait ce qui suit et travaillé plutôt bien:
Si process1 est lu, il exécute process2. Sinon, il incrémente les temps variables et rend le gestionnaire exécuté après une seconde. Il maintient une boucle jusqu'à ce que process1 soit lu ou que times soit 5. Lorsque times est égal à 5, cela signifie que 5 secondes se sont écoulées et à chaque seconde, la clause if de process1.isRead () est exécutée.
la source
En utilisant kotlin et sa Coroutine, c'est assez facile, déclarez d'abord un travail dans votre classe (mieux dans votre viewModel) comme ceci:
puis quand vous voulez créer et démarrer, faites ceci:
et si vous voulez le terminer:
PS:
viewModelScope
n'est disponible que dans les modèles de vue, vous pouvez utiliser d'autres étendues Coroutine telles quewithContext(Dispatchers.IO)
Plus d'informations: ici
la source
Pour les personnes utilisant Kotlin, la réponse d'inazaruk ne fonctionnera pas, l'EDI nécessitera l'initialisation de la variable, donc au lieu d'utiliser l'
postDelayed
intérieur deRunnable
, nous l'utiliserons dans une méthode distincte.Initialisez votre
Runnable
comme ceci:Initialisez votre
runDelayedHandler
méthode comme ceci:Comme vous pouvez le voir, cette approche vous permettra de contrôler la durée de vie de la tâche, de la suivre
keepRunning
et de la modifier pendant la durée de vie de l'application fera le travail pour vous.la source