7

私は5秒ごとにランナブルを投稿し続けるHandlerThreadを持っています。このようなもの:

HandlerThread thread = new HandlerThread("MyThread");
thread.start();
Handler handler = new Handler(thread.getLooper());
handler.post(new Runnable() {
  public void run() { 
    //...
    handler.postDelayed(this, 5000);
  }
});

ある時点でルーパーを終了する必要があります.60秒後など..なので、次のように書きます。

mainHandler = new Handler(Looper.myLooper()); //main thread's
mainHandler.postDelayed(new Runnable() {
  @Override
  public void run() {
    thread.getLooper().quit();
  }
}, 60000);

これにより、ルーパーが突然終了すると思われるため、次の「警告」メッセージが表示され始めます。

W/MessageQueue(3726): java.lang.RuntimeException: Handler (android.os.Handler) {4823dbf8} がデッド スレッドの Handler にメッセージを送信しています

このエラーメッセージを回避したいのですが、メソッドを使えば解決できると思っていたのですが、 APILooper.quitSafely()を確認したところ利用できなくなりました。何が起こったのか知っている人はいますか?(他の方法のように非推奨ではありません)。

ルーパーを安全に終了する方法はありますか? ありがとう!

4

2 に答える 2

1

ブール値を使用して、コードを実行する必要があるかどうかを確認できます。このようなもの:

private boolean runHandler = true;

...

HandlerThread thread = new HandlerThread("MyThread");
thread.start();
Handler handler = new Handler(thread.getLooper());
handler.post(new Runnable() {
    public void run() { 
        if(runHandler){   
            //...
            handler.postDelayed(this, 5000);
        }
    }      
});

mainHandler = new Handler(Looper.myLooper()); //main thread's
mainHandler.postDelayed(new Runnable() {
    @Override
    public void run() {
        runHandler = false;
    }
}, 60000);
于 2013-07-30T08:17:03.337 に答える
0

私は Thread Guru ではありませんが、次の方法で方向性を示すことができます。

 ...
_thread.setRunning(true);
_thread.start();

 ..

 public void stopThread(){
    boolean retry = true;
    _thread.setRunning(false);
    while (retry) {
        try {
            _thread.join();
            retry = false;
            Log.e("test", "thread stopped");
        } catch (InterruptedException e) {
            Log.e("test", "can't stop thread, retrying...");
            // we will try it again and again...
        }
    }
}

あなたのスレッドで:

while (isRunning) {
   //...
 }

runまず、ループでメソッドを実装します( while(isRunnig){})。

終了したら、フラグを false に切り替えて「待機」しjoinます。

于 2013-07-30T08:15:03.687 に答える