2017-11-01 15 views
-2

タイマーに問題があります。このアクションの代わりに2秒後にエラーが発生します。タイマーの使い方 - 方法?

public class MainActivity extends AppCompatActivity { 

    private TextView tv; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     tv = (TextView)findViewById(R.id.tv); 

     Timer timer=new Timer(); 

     TimerTask timerTask = new TimerTask() { 
      @Override 
      public void run() { 
       tv.setText("why?"); 
      } 
     }; 

     timer.schedule(timerTask,2000); 
    } 
} 

これを修正するにはどうすればよいですか?

+2

を使用してハンドラにメッセージを送信しますか? – Kuba

+0

アプリケーションでエラーが発生しました:「プログラムが停止しました」 –

+1

ADBでエラーが発生しました。 Android Studioを使用している場合は、モニタでエラーを見つけるだけです。 – eozd

答えて

1

あなたは非メインスレッドからこれらを実行することはできません

あなたが、私はそれがどのように見える知っrunOnUiThread

@Override 
    public void run() { 
      tv.post(new Runnable(){ 
       @Override 
       public void run() { 
        tv.setText("why?"); 
       }}); 
      } 
    } 

のようなビューの

@Override 
    public void run() { 
      runOnUiThread(new Runnable(){ 
       @Override 
       public void run() { 
        tv.setText("why?"); 
       }}); 
      } 
    } 

または使用後のメソッドを使用する必要が

 @Override 
     public void run() { 
      tv.setText("why?"); 
     } 

奇妙ですが、lambdaを使って書くと、はるかに上手く簡潔になります

timer.schedule(()->{tv.post(()->{setText("why?");}},2000); 
0

スレッド内からUIを更新することはできません。メインスレッドからUIを更新します。

作業が完了し、UIthereを更新した後にハンドラにメッセージを送信します。

Handler handler = new Handler() 
{ 
    @Override 
    public void handleMessage(Message msg) { 
     super.handleMessage(msg); 
     // Update UI 
    } 
}; 

、あなたはどのようなエラーを取得しているhandler.sendMessage()

関連する問題