2017-06-09 9 views
0

途中でNoobの質問。下のコードでは、Androidのボタンのテキストを更新します。それから、2秒待ってから再度テキストを更新します。私が2番目のb.setText( "Send data")をコメントすると、スリープ後にb.setText( "Success")がボタンに書き込まれます。そのことについて私がコメントしなければ、ボタン上でテキスト "Success"が表示されず、 "Send data"だけが表示されます。 2番目のb.setText( "Send data")があると、Thread.sleep()がスキップされるようです。 Googleは、setText( "Success")の後にタイマーを追加して、setText()コードがスリープする前に実行される時間を持つようにすることを提案しました。助けてくれなかった。button.setText()と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

レンダーループをブロックします。 –

+0

更新を行う新しいスレッドを生成する必要があります。したがって、メインスレッドで待機する代わりに、あなたのthread.sleep()と更新を含む新しいスレッドを生成してください。 –

+0

ありがとう!私はいくつかのバージョンを試しましたが、その後、ボタンを作成したスレッドだけで更新が行われ、それがメインスレッドになるというエラーが出ました。 – BjornW

答えて

0

多くの方法があります。 新しいスレッドを実行してからビューを更新することができます。
または:

 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

助けてくれてありがとう! – BjornW

2

あなたのメインスレッドをブロックしないでください。代わりにHandler.postを使用してください。

  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

これを使って完璧に動作しました!どうもありがとう! – BjornW

関連する問題