Search code examples
javaandroidmultithreadingandroid-handlerandroid-looper

Android Java object with own thread using looper


I have tried to implement object in Android that would work in its own thread (I do not want to make handler public, I want to wrap sentMessage method with own public api). It has public methods to pass data to object. This object is associated with activity lifecycle (onResume, onPause). I would like to use looper and handler, not just pure Java thread with infinite loop. I want to start worker thread on resume and stop working on pause callback. Object has to wait for new message infinitely. This is my code below:

public class ThreadingObject {

    private MyThread thread;

    public ThreadingObject() {}

    public void onResume() {
        thread = new MyThread();
        thread.startWorking();
    }

    public void onPause() {
        thread.stopWorking();
    }

    public void setMessage(Object object) {
        Message msg = new Message();
        msg.obj = object;
        thread.handler.sendMessage(msg);
    }

    protected void work(Object object) {
        //Do something with object in own thread
    }

    private class MyThread extends Thread {
        public Handler handler;

        @Override
        public void run() {
            Looper.prepare();
            handler = new Handler() {

                @Override
                public void handleMessage(Message msg) {
                    ThreadingObject.this.work((String[]) msg.obj);
                }
            };
            Looper.loop();
        }

        public void startWorking() {
            start();
        }

        public void stopWorking() {
            handler.getLooper().quit();
        }
    }
}

Is it correct implementation? I receive warning: "sending message to a handler on a dead thread". Is there any issue that I do not see?


Solution

  • It is my implementation:

    public class ThreadingObject {
    
        private HandlerThread thread;
        private Handler handler;
    
        private Handler.Callback handlerCallback = new Handler.Callback() {
            @Override
            public boolean handleMessage(Message msg) {
                work(msg.obj);
                return true;
            }
        };
    
        public ThreadingObject() {}
    
        public void onResume() {
            thread = new HandlerThread("SurfaceView HandlerThread");
            thread.start();
            handler = new Handler(thread.getLooper(), handlerCallback);
        }
    
        public void onPause() {
            if(thread != null) {
                thread.quit();
                thread = null;
            }
            handler = null;
        }
    
        public void setMessage(Object object) {
            Message msg = new Message();
            msg.obj = object;
            handler.sendMessage(msg);
        }
    
        protected void work(Object obj) {
            //Working
        }
    }