package net.hopeisagoodthing.handlerthreadexample; import android.os.Handler; import android.os.Looper; import android.os.Message; import android.util.Log; import java.util.concurrent.CountDownLatch; class SimpleThread extends Thread implements ClosableThread { private static final String TAG = SimpleThread.class.getSimpleName(); private Handler handler; private CountDownLatch countDownLatch = new CountDownLatch(1); private static final int REQUEST = 1; private Monitor monitor; SimpleThread(Monitor monitor) { super(TAG); this.monitor = monitor; } @Override public void run(){ Looper.prepare(); handler = new Handler(new Handler.Callback() { @Override public boolean handleMessage(Message message) { switch (message.what) { case REQUEST: Log.i(TAG,"new request has been arrived. " + message.obj); if(monitor != null) { monitor.onProcessed((String)message.obj); } break; } return false; } }); if(monitor != null) { monitor.onStarted(this); } countDownLatch.countDown(); Looper.loop(); } void request(String request) { if(getState() == State.NEW) { start(); } try { countDownLatch.await(); } catch (InterruptedException e) { Log.e(TAG,"request: interrupted.", e); } if(handler != null) { Message message = handler.obtainMessage(REQUEST, request); handler.sendMessage(message); } } @Override public void close(){ handler.getLooper().quitSafely(); this.interrupt(); Log.i(TAG,"closed."); } }