2016-11-21 15 views
-1

スレッドがLooper.Prepare()とLooper.loop()でメッセージを待つというシナリオがあります。 UIでボタンがクリックされたとき、ボタンのクリックを通知するメッセージをHandlerに送信します。ボタンを2分間クリックしなければ、私はルーパーを壊したい、それを達成する方法は?私はタイマーとTimerTaskをを使用してみましたが、何もアンドロイドハンドラが一定期間メッセージを待つ

Looper.prepare(); 
     uiHandler = new Handler() { 
     public void handleMessage(Message msg) { 
     // Act on the message 
     if (msg.obj.contains("DONE")) { 
     Toast.makeText(MainActivity.this, "Done task",     
       Toast.LENGTH_LONG).show(); 
     }  
     } 
    } 
    Looper.loop(); 

は、UIスレッドから非UIスレッドで次のようにコードがある

起こりません:あなたはハンドラを使用することによって、これを達成することができます

btnDone.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      Message msg = Message.obtain(); 
      msg.obj = "DONE"; 
      uiHandler.sendMessage(msg); 
     } 
    }); 
+1

'<=、それは最初のJavaの基礎を学ぶ方が良いでしょう... – Selvin

+0

コール' Looper.quit() ''適切な== "DONE"。 – earthw0rmjim

+0

2ミントが完了したことをルーパーに通知するにはどうすればいいですか?私は直面しています... –

答えて

0

postDelayed方法

Runnable runnable = new Runnable() { 
    @Override 
    public void run() { 
     Toast.makeText(MainActivity.this, "Done task",     
      Toast.LENGTH_LONG).show(); 
    } 
} 
uihandler.postDelayed(runnable , 2*60*1000); 

とonClickListener use removeCallback方法

uiHandler.removeCallbacks(runnable); 
+0

RunnableはUIスレッドか非スレッドですか? –

+0

は問題ではありません。ハンドラを定義する場所によって異なり、MainActivityで定義したように見えますが、MainActivityのスレッドで処理されます – Farid

関連する問題