Quelqu'un peut-il donner un exemple simple de mise à jour d'un champ de texte toutes les secondes environ?
Je veux faire une balle volante et j'ai besoin de calculer / mettre à jour les coordonnées de la balle chaque seconde, c'est pourquoi j'ai besoin d'une sorte de minuterie.
Je ne reçois rien d' ici .
Réponses:
ok car ce n'est pas encore clarifié, il y a 3 façons simples de gérer cela. Ci-dessous est un exemple montrant les 3 et en bas est un exemple montrant juste la méthode que je crois préférable. Pensez également à nettoyer vos tâches dans onPause, en sauvegardant l'état si nécessaire.
la principale chose à retenir est que l'interface utilisateur ne peut être modifiée qu'à partir du thread d'interface utilisateur principal, utilisez donc un gestionnaire ou activity.runOnUIThread (Runnable r);
Voici ce que je considère comme la méthode préférée.
la source
C'est simple! Vous créez une nouvelle minuterie.
Ensuite, vous étendez la tâche du minuteur
Et puis ajoutez la nouvelle tâche au minuteur avec un certain intervalle de mise à jour
Avertissement: Ce n'est pas la solution idéale. Il s'agit d'une solution utilisant la classe Timer (comme demandé par OP). Dans Android SDK, il est recommandé d'utiliser la classe Handler (il y a un exemple dans la réponse acceptée).
la source
Si vous devez également exécuter votre code sur le thread d'interface utilisateur (et non sur le thread du minuteur), jetez un œil sur le blog: http://steve.odyfamily.com/?p=12
la source
Si vous souhaitez simplement planifier un compte à rebours jusqu'à une date ultérieure avec des notifications régulières à intervalles réguliers, vous pouvez utiliser la classe CountDownTimer qui est disponible depuis le niveau 1 de l'API.
la source
SS:MiMi
? MerciVoici un code simple pour une minuterie:
la source
Je pense que vous pouvez le faire de manière Rx comme:
Et annulez ceci comme:
Rx Timer http://reactivex.io/documentation/operators/timer.html
la source
Parce que cette question attire toujours beaucoup d'utilisateurs de la recherche Google (sur le minuteur Android), je voudrais insérer mes deux pièces.
Tout d'abord, la classe Timer sera déconseillée en Java 9 (lire la réponse acceptée) .
La manière officielle suggérée est d'utiliser ScheduledThreadPoolExecutor qui est plus efficace et riche en fonctionnalités qui peut en outre planifier des commandes à exécuter après un certain délai ou à exécuter périodiquement. De plus, il offre une flexibilité et des capacités supplémentaires à ThreadPoolExecutor.
Voici un exemple d'utilisation de fonctionnalités simples.
Créer un service d'exécuteur:
Planifiez simplement votre runnable:
Vous pouvez maintenant utiliser
future
pour annuler la tâche ou vérifier si cela est fait par exemple:J'espère que cela vous sera utile pour créer des tâches dans Android.
Exemple complet:
la source
Je suis surpris qu'aucune réponse ne mentionne une solution avec RxJava2 . C'est vraiment simple et fournit un moyen facile de configurer la minuterie dans Android.
Vous devez d'abord configurer la dépendance Gradle, si vous ne l'avez pas déjà fait:
(remplacer
x
ety
par le numéro de version actuel )Puisque nous avons juste une TÂCHE simple, NON RÉPÉTABLE , nous pouvons utiliser
Completable
objet:Pour RÉPÉTER LA TÂCHE , vous pouvez utiliser
Observable
de la même manière:Schedulers.computation()
s'assure que notre minuterie fonctionne sur le fil de fond et.observeOn(AndroidSchedulers.mainThread())
signifie que le code que nous exécutons une fois le minuteur terminé sera exécuté sur le thread principal.Pour éviter les fuites de mémoire indésirables, vous devez vous assurer de vous désabonner lorsque l'activité / le fragment est détruit.
la source
Subscription
retournée par.subscribe()
dans la variable, puis appelezsubscription.unsubscribe()
lorsque vous souhaitez arrêter le chronomètre.Il est une solution plus simple, fonctionne très bien dans mon application.
la source
Vous souhaitez que vos mises à jour d'interface utilisateur se produisent dans le thread d'interface utilisateur déjà existant.
La meilleure façon est d'utiliser un gestionnaire qui utilise postDelayed pour exécuter un Runnable après un délai (chaque exécution planifie la suivante); effacez le rappel avec removeCallbacks.
Vous cherchez déjà au bon endroit, alors revoyez-le, peut-être clarifiez pourquoi cet exemple de code n'est pas ce que vous voulez. (Voir également l'article identique dans Mise à jour de l'interface utilisateur à partir d'un minuteur ).
la source
Voici un moyen simple et fiable ...
Mettez le code suivant dans votre activité, et la méthode tick () sera appelée chaque seconde dans le thread d'interface utilisateur pendant que votre activité est à l'état "repris". Bien sûr, vous pouvez changer la méthode tick () pour faire ce que vous voulez, ou être appelé plus ou moins fréquemment.
Pour les personnes intéressées, le code "_h0 = _handler" est nécessaire pour éviter que deux minuteries ne s'exécutent simultanément si votre activité est suspendue et reprise dans la période de tick.
la source
_h0
approche maladroite , au lieu de l'removeCallbacks
intérieuronPause
, comme tout le monde?Vous pouvez également utiliser un animateur pour cela:
la source
Vous devez créer un thread pour gérer la boucle de mise à jour et l'utiliser pour mettre à jour la zone de texte. Cependant, la partie délicate est que seul le thread principal peut réellement modifier l'interface utilisateur, de sorte que le thread de la boucle de mise à jour doit signaler au thread principal de faire la mise à jour. Cela se fait à l'aide d'un gestionnaire.
Consultez ce lien: http://developer.android.com/guide/topics/ui/dialogs.html# Cliquez sur la section intitulée "Exemple de ProgressDialog avec un deuxième fil". C'est un exemple de ce que vous devez faire exactement, sauf avec une boîte de dialogue de progression au lieu d'un champ de texte.
la source
la source
Si quelqu'un est intéressé, j'ai commencé à jouer avec la création d'un objet standard à exécuter sur un thread d'interface utilisateur d'activités. Semble fonctionner correctement. Commentaires bienvenus. J'aimerais que cela soit disponible sur le concepteur de mise en page en tant que composant à faire glisser sur une activité. Je ne peux pas croire que quelque chose comme ça n'existe pas déjà.
Dans l'activité, j'ai ceci surStart:
la source
.xml
la source
Si vous avez déjà du temps delta.
la source
J'ai résumé la minuterie et en ai fait une classe séparée:
Et extraire l'action principale de la
Timer
classe commeEt je l'ai utilisé comme ça:
J'espère que cela aide 😊👌
la source
J'utilise de cette façon:
puis en dessous du onCreate
c'est un moyen facile de résoudre ce problème.
la source
Pour ceux qui ne peuvent pas compter sur Chronometer , j'ai fait une classe utilitaire à partir d'une des suggestions:
à utiliser .. il suffit de faire:
.....
la source