Example communicating with HandlerThread Example communicating with HandlerThread multithreading multithreading

Example communicating with HandlerThread


This is a working example:

HandlerThread ht = new HandlerThread("MySuperAwesomeHandlerThread");ht.start();Handler h = new Handler(ht.getLooper()) {    public void handleMessage(Message msg) {        Log.d(TAG, "handleMessage " + msg.what + " in " + Thread.currentThread());    };};for (int i = 0; i < 5; i++) {    Log.d(TAG, "sending " + i + " in " + Thread.currentThread());    h.sendEmptyMessageDelayed(i, 3000 + i * 1000);}

UPDATE:

Make two class fields:

Handler mHtHandler;Handler mUiHandler;

and try this:

HandlerThread ht = new HandlerThread("MySuperAwsomeHandlerThread");ht.start();Callback callback = new Callback() {    @Override    public boolean handleMessage(Message msg) {        if (msg.what == 0) {            Log.d(TAG, "got a meaasage in " + Thread.currentThread() + ", now sleeping... ");            try {                Thread.sleep(2000);            } catch (InterruptedException e) {                e.printStackTrace();            }            Log.d(TAG, "woke up, notifying ui thread...");            mUiHandler.sendEmptyMessage(1);        } else        if (msg.what == 1) {            Log.d(TAG, "got a notification in " + Thread.currentThread());        }        return false;    }};mHtHandler = new Handler(ht.getLooper(), callback);mUiHandler = new Handler(callback);mHtHandler.sendEmptyMessageDelayed(0, 3000);

You can of course get rid of Callback interface and create two Handlers with overridden handleMessage method...


The issue you are seeing is because your outer class is using a private mHandler field and so does your HandlerThread. The outer class' field is not initialized. You don't need the inner mHandler. The outer class can crate a handler from the looper you grab right after calling start().