2017-06-09 7 views
0

Question de noob sur son chemin. Dans le code ci-dessous je mets à jour le texte d'un bouton sous Android. Ensuite, je veux attendre deux secondes, puis mettre à jour le texte à nouveau. Si je commente le second b.setText ("Envoyer les données"), celui après le sommeil - alors b.setText ("Success") est écrit sur le bouton. Si je ne commente pas celui-ci, je ne verrai jamais le texte "Success" sur le bouton, seulement "Send data". C'est comme si Thread.sleep() est ignoré quand j'ai le second b.setText ("Send data"). Google a suggéré d'ajouter une minuterie après setText ("Success") afin que le code setText() ait le temps d'être exécuté avant le sommeil. N'a pas aidé.button.setText() et Thread.sleep()

final Button b = (Button) findViewById(R.id.button); 
      b.setText("Send data"); 

      b.setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View v) 
      { 
       b.setClickable(false); 
       b.setText("Success"); 
       System.out.println("Debug before"); 

       try 
       { 
       Thread.sleep(2000); 
       } 
       catch (Exception e) 
       { 

       } 

       System.out.println("Debug after"); 
       b.setText("Send data"); 
       b.setClickable(true); 
    } 
    }); 
+0

Vous bloquez votre boucle de rendu. –

+0

Vous devez générer un nouveau thread qui effectuera la mise à jour. Ainsi, au lieu d'attendre dans le thread principal, générer un nouveau thread qui contient votre thread.sleep() et la mise à jour. –

+0

Merci! J'ai essayé une version de cela mais ensuite j'ai eu l'erreur que les mises à jour seulement peuvent être faites par le fil qui a créé le bouton, et c'est le fil principal. – BjornW

Répondre

0

Il existe plusieurs façons de le faire. vous pouvez exécuter un nouveau thread, puis mettre à jour l'affichage.
Ou:

 CountDownTimer countDownTimer = new CountDownTimer(2000, 1000) { 
       public void onTick(long millisUntilFinished) { 
       // 
       } 

       public void onFinish() { 
        //update your view 
        System.out.println("Debug after"); 
        b.setText("Send data"); 
       } 
      }; 
      countDownTimer.start(); 
+0

Merci pour l'aide! – BjornW

2

Ne pas bloquer votre thread principal. Utilisez Handler.post à la place

  b.setClickable(false); 
      b.setText("Success"); 
      System.out.println("Debug before"); 

      new Handler().postDelayed(new Runnable(){ 
       System.out.println("Debug after"); 
       b.setText("Send data"); 
       b.setClickable(true); 
      }, 2000); 
+0

Utilisé celui-ci et a parfaitement fonctionné! Merci beaucoup! – BjornW