Je veux pouvoir appeler la méthode suivante après un délai spécifié. Dans l'objectif c, il y avait quelque chose comme:
[self performSelector:@selector(DoSomething) withObject:nil afterDelay:5];
Existe-t-il un équivalent de cette méthode dans Android avec Java? Par exemple, je dois pouvoir appeler une méthode après 5 secondes.
public void DoSomething()
{
//do something here
}
removeCallbacks(Runnable r)
leHandler
.import android.os.handler
Je n'ai pu utiliser aucune des autres réponses dans mon cas. J'ai plutôt utilisé le minuteur Java natif.
la source
Remarque: Cette réponse a été donnée lorsque la question ne spécifiait pas Android comme contexte. Pour une réponse spécifique au fil d'AU Android, regardez ici.
Il semble que l'API Mac OS laisse le thread actuel continuer et planifie l'exécution de la tâche de manière asynchrone. En Java, la fonction équivalente est fournie par le
java.util.concurrent
package. Je ne sais pas quelles limitations Android pourrait imposer.la source
ScheduledFuture<?>
retourné parworker.schedule()
et appelez sacancel(boolean)
méthode.ScheduledExecutorService
.Pour exécuter quelque chose dans le thread d'interface utilisateur après 5 secondes:
la source
vous pouvez utiliser Handler dans UIThread:
la source
Merci pour toutes les bonnes réponses, j'ai trouvé une solution qui correspond le mieux à mes besoins.
la source
1. Utilisation
Handler
2. Utilisation de TimerTask
Ou encore plus court
Ou le plus court serait
3. Utilisation
Executors
1. Utilisation
Handler
2. Utilisation
Timer
3. Utilisation
ScheduledExecutorService
la source
How to call a method after a delay in Android
. Je me suis donc concentré sur cela. Jusqu'au point. Sinon, les fuites Java sont un gros sujet à comprendre séparément pour les développeurs.Voir cette démo:
la source
Si vous devez utiliser le gestionnaire, mais que vous êtes dans un autre thread, vous pouvez utiliser
runonuithread
pour exécuter le gestionnaire dans le thread d'interface utilisateur. Cela vous évitera des exceptions levées demandant d'appelerLooper.Prepare()
Semble assez désordonné, mais c'est l'un des moyens.
la source
Je préfère utiliser la
View.postDelayed()
méthode, le code simple ci-dessous:la source
Voici ma solution la plus courte:
la source
la source
Si vous utilisez Android Studio 3.0 et supérieur, vous pouvez utiliser des expressions lambda. La méthode
callMyMethod()
est appelée après 2 secondes:Au cas où vous auriez besoin d'annuler le runnable retardé, utilisez ceci:
la source
Je suggère la minuterie , il vous permet de programmer une méthode à appeler sur un intervalle très précis. Cela ne bloquera pas votre interface utilisateur et gardera votre application sensible pendant l'exécution de la méthode.
L'autre option est l' attente (); , cela bloquera le thread en cours pendant la durée spécifiée. Cela entraînera votre interface utilisateur cesser de répondre si vous le faites sur le thread d'interface utilisateur.
la source
Pour un délai de traitement de ligne simple, vous pouvez procéder comme suit:
J'espère que ça aide
la source
Vous pouvez l'utiliser pour la solution la plus simple:
Sinon, ci-dessous peut être une autre solution utile propre:
la source
Vous pouvez le rendre beaucoup plus propre en utilisant les expressions lambda nouvellement introduites:
la source
Il y a donc quelques éléments à considérer ici car il y a tellement de façons de dépouiller ce chat. Bien que toutes les réponses aient déjà été données sélectionnées et choisies. Je pense qu'il est important que cela soit revisité avec des directives de codage appropriées pour éviter que quiconque aille dans la mauvaise direction simplement à cause de la "réponse simple choisie par la majorité".
Alors d'abord, discutons de la réponse simple Post Delayed qui est la réponse sélectionnée par le gagnant dans l'ensemble de ce fil.
Quelques points à considérer. Après le délai de post-traitement, vous pouvez rencontrer des fuites de mémoire, des objets morts, des cycles de vie qui ont disparu, etc. Il est donc également important de le manipuler correctement. Vous pouvez le faire de deux manières.
Par souci de développement moderne, je fournirai en KOTLIN
Voici un exemple simple d'utilisation du thread d'interface utilisateur sur un rappel et de confirmation que votre activité est toujours bien vivante lorsque vous appuyez sur votre rappel.
Cependant, ce n'est toujours pas parfait car il n'y a aucune raison de frapper votre rappel si l'activité a disparu. donc une meilleure façon serait de garder une référence et de supprimer ses rappels comme celui-ci.
et bien sûr gérer le nettoyage sur le onPause afin qu'il ne frappe pas le rappel.
Maintenant que nous avons parlé de l'évidence, parlons d'une option plus propre avec les coroutines modernes et la kotlin :). Si vous ne les utilisez pas encore, vous en manquez vraiment.
ou si vous voulez toujours faire un lancement d'interface utilisateur sur cette méthode, vous pouvez simplement faire:
Bien sûr, tout comme le PostDelayed, vous devez vous assurer de gérer l'annulation afin de pouvoir effectuer les vérifications d'activité après l'appel différé ou vous pouvez l'annuler dans la onPause, tout comme l'autre itinéraire.
// gérer le nettoyage
Si vous placez le lancement (UI) dans la signature de méthode, le travail peut être attribué dans la ligne de code appelante.
La morale de l'histoire est donc d'être en sécurité avec vos actions retardées, assurez-vous de supprimer vos rappels ou d'annuler vos travaux et bien sûr de confirmer que vous avez le bon cycle de vie pour toucher les éléments de votre rappel différé. Les Coroutines proposent également des actions annulables.
Il convient également de noter que vous devez généralement gérer les diverses exceptions qui peuvent accompagner les coroutines. Par exemple, une annulation, une exception, un délai d'expiration, tout ce que vous décidez d'utiliser. Voici un exemple plus avancé si vous décidez de vraiment commencer à utiliser des coroutines.
la source
J'ai créé une méthode plus simple pour appeler cela.
Pour l'utiliser, il suffit d'appeler:
.CallWithDelay(5000, this, "DoSomething");
la source
performSelector
. c'est la meilleure façon de procéder.Ci-dessous on travaille quand vous obtenez,
la source
En utilisant Kotlin, nous pouvons y parvenir en procédant comme suit
la source
C'est très simple d'utiliser le
CountDownTimer
. Pour plus de détails https://developer.android.com/reference/android/os/CountDownTimer.htmlla source
Si vous utilisez RxAndroid, la gestion des threads et des erreurs devient beaucoup plus facile. Le code suivant s'exécute après un délai
la source
tout le monde semble oublier de nettoyer le gestionnaire avant de poster un nouveau runnable ou un message dessus. Sinon, ils pourraient potentiellement s'accumuler et provoquer un mauvais comportement.
la source
Voici un autre moyen délicat: il ne lèvera pas d'exception lorsque le runnable change les éléments de l'interface utilisateur.
Vous pouvez appeler l'animation comme ceci:
L'animation peut être attachée à n'importe quelle vue.
la source
Voici la réponse dans Kotlin vous les gens paresseux, paresseux:
la source
J'aime les choses plus propres: voici mon implémentation, du code en ligne à utiliser dans votre méthode
la source
Une solution adaptée dans Android:
la source
Solution similaire mais beaucoup plus propre à utiliser
Écrivez cette fonction en dehors de la classe
Usage:
la source
do
est une méthode intégrée, nous devons donc utiliser `pour l'utiliser comme nom de variabledo
ça après un retard de 3 secSous Android, nous pouvons écrire ci-dessous du code kotlin pour retarder l'exécution de n'importe quelle fonction
la source