382 votes

Comment faire pour exécuter un thread exécutable présentant dans Android ?

J’ai développé une petite application pour afficher du texte à des intervalles définis dans l’écran de l’émulateur android. J’utilise la classe de gestionnaire, petit extrait de mon code

Quand je lance cette appication le texte s’affiche qu’une seule fois. S’il vous plaît quelqu'un sait comment faire pour exécuter un thread à l’aide gestionnaire me.

569voto

alex2k8 Points 12225

La solution simple à votre exemple est:

handler=new Handler();

final Runnable r = new Runnable()
{
    public void run() 
    {
        tv.append("Hello World");
        handler.postDelayed(this, 1000);
    }
};

handler.postDelayed(r, 1000);

Ou nous pouvons utiliser des thread par exemple (avec Coureur d'origine):

Thread thread = new Thread()
{
    @Override
    public void run() {
        try {
            while(true) {
                sleep(1000);
                handler.post(r);
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
};

thread.start();

Vous pouvez considérer votre objet praticable tout comme une commande qui peut être envoyé à la file d'attente de messages pour l'exécution, et son maître comme un objet d'assistance utilisé pour envoyer la commande.

Plus de détails ici http://developer.android.com/reference/android/os/Handler.html

55voto

user2212515 Points 116
            new Handler().postDelayed(new Runnable() {
                public void run() {

                }
            }, 100);

40voto

NguyenDat Points 2032

Je pense peut améliorer la première solution de Alex2k8 pour la mise à jour de correction de chaque seconde

1.Code d'origine:

public void run() 
{
    tv.append("Hello World");
    handler.postDelayed(this, 1000);
}

2.L'analyse

  • Au-dessus de coût, d'assumer la télévision.append("Bonjour")" coût T millisecondes, après l'affichage de 500 fois la période de retard est de 500*T millisecondes
  • Il permettra d'augmenter retard lors de l'exécution à long temps

3. Solution

Pour éviter qu'il suffit de changer l'ordre de postDelayed(), pour éviter de retard:

public void run() 
{
    handler.postDelayed(this, 1000);
    tv.append("Hello World");
}

24voto

iTech Points 7948

Je crois que pour ce cas typique, c'est à dire de lancer quelque chose avec un intervalle de temps fixe, Timer est plus approprié. Voici un exemple simple:

myTimer = new Timer();
myTimer.schedule(new TimerTask() {          
@Override
public void run() {
        // If you want to modify a view in your Activity
         MyActivity.this.runOnUiThread(new Runnable()
         public void run(){
              tv.append("Hello World");
         }  
       );
}
}, 1000, 1000); // initial delay 1 second, interval 1 second

À l'aide de Timer a quelques avantages:

  • Retard Initial et de l'intervalle peut être facilement spécifiée dans l' schedule arguments de la fonction
  • La minuterie peut être arrêté simplement en appelant myTimer.cancel()
  • Si vous voulez avoir un seul thread en cours d'exécution, n'oubliez pas d'appeler myTimer.annuler() avant la planification d'une nouvelle (si myTimer n'est pas null)

17voto

singh arjun Points 61
Handler handler=new Handler();
Runnable r = new Runnable(){
    public void run() {
        tv.append("Hello World");                       
        handler.postDelayed(r, 1000);
    }
}; 
handler.post(r);

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X