package cm.android.sdk; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import android.os.Handler; import android.os.Looper; import android.os.Message; import java.lang.ref.WeakReference; public abstract class WeakHandler { private static final Logger logger = LoggerFactory.getLogger("WeakHandler"); private Handler handler = null; public WeakHandler() { handler = new InnerHandler(this); } public WeakHandler(Looper looper) { handler = new InnerHandler(this, looper); } public abstract void handleMessage(Message msg); public Handler get() { return handler; } private static class InnerHandler extends Handler { private WeakReference<cm.android.sdk.WeakHandler> mOuter; public InnerHandler(cm.android.sdk.WeakHandler callback) { super(); mOuter = new WeakReference<>(callback); } public InnerHandler(cm.android.sdk.WeakHandler callback, Looper looper) { super(looper); mOuter = new WeakReference<>(callback); } @Override public final void handleMessage(Message msg) { cm.android.sdk.WeakHandler outer = mOuter.get(); if (outer != null) { outer.handleMessage(msg); } else { logger.error("WeakHandler:outer = null"); } } @Override public void dispatchMessage(Message msg) { super.dispatchMessage(msg); } @Override public boolean sendMessageAtTime(Message msg, long uptimeMillis) { return super.sendMessageAtTime(msg, uptimeMillis); } } }