package cm.android.thread; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import android.os.Looper; import android.os.Message; import java.util.concurrent.atomic.AtomicBoolean; import cm.android.sdk.WeakHandler; import cm.java.thread.SimpleLock; public class AsyncHandler extends WeakHandler { private static final Logger logger = LoggerFactory.getLogger("thread"); public AsyncHandler(Looper looper) { super(looper); if (looper == Looper.getMainLooper()) { logger.error("looper == Looper.getMainLooper()"); throw new IllegalArgumentException("AsyncHandler:looper == Looper.getMainLooper()"); } } @Override public final void handleMessage(Message message) { logger.info("{}:handleMessage:begin", this); handleFlag.set(true); try { // handleMessageImpl(message); } finally { handleFlag.set(false); lock.signalAll(); logger.info("{}:handleMessage:end", this); } } protected void handleMessageImpl(Message message) { } private volatile AtomicBoolean handleFlag = new AtomicBoolean(false); private final SimpleLock lock = new SimpleLock(); public void exit() { this.get().removeCallbacksAndMessages(null); logger.info("{}:exit:begin", this); while (handleFlag.get()) { lock.await(); } logger.info("{}:exit:end", this); } }