Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to quit HandlerThread's looper safely

I have a HandlerThread, to which I keep posting a runnable every 5 seconds. Something like this:

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

I need to quit the looper at some point, after 60 seconds or something like that.. so I write:

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

I think this causes the looper to quit abruptly, so I start getting this "warning" messages:

W/MessageQueue(3726): java.lang.RuntimeException: Handler (android.os.Handler) {4823dbf8} sending message to a Handler on a dead thread

I want to avoid this error msg, I thought that I could solve it by using the Looper.quitSafely() method.. but I checked the API and it's no longer available. Does anyone know what happened to it? (It's not deprecated like some other methods).

Is there some way I can quit the looper safely? Thanks!

like image 787
sundie Avatar asked Jul 30 '13 07:07

sundie


1 Answers

You could try to use a boolean to know if the code should be executed. Something like this:

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);
like image 159
PX Developer Avatar answered Sep 18 '22 00:09

PX Developer