Handler防泄漏的正確使用姿勢

某年某月某日在VLC的庫源碼里面看到的,總結一下


public class WeakHandler<T extends WeakHandler.MessageListener> extends Handler {
    private final WeakReference<T> mHandlerReference;

    public WeakHandler(T owner) {
        mHandlerReference = new WeakReference<>(owner);
    }


    @Override
    public void handleMessage(Message msg) {
        final T owner = getOwner();
        if (owner != null) {
            owner.handleMessage(msg);
        }
    }

    public interface MessageListener {
        public void handleMessage(Message msg);
    }

    public T getOwner() {
        return this.mHandlerReference.get();
    }

    public void clear() {
        mHandlerReference.clear();
    }
}

在activity里面使用


public class HandlerActivity extends Activity implements MyWeakHandler.MessageListener {

    private static MyWeakHandler<HandlerActivity> sHandler;//設置成靜態成員,否則會出現內存泄漏
    public static final int MSG_ON_A = 0x111;
    public static final int MSG_ON_B = 0x112;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        sHandler = new MyWeakHandler<>(this);
    }


    @Override
    protected void onDestroy() {
        super.onDestroy();
        sHandler.removeCallbacksAndMessages(null);//清除所有未處理的消息
        sHandler.clear();
        sHandler=null;
    }

    private void backgroundWorkA() {

        .....
        //耗時操作,一般在線程的run方法或者Android系統框架回調放方法,比如低功耗藍牙 BluetoothAdapter.LeScanCallback的 onLeScan()回調方法
        sHandler.obtainMessage(MSG_ON_A).sendToTarget();
        .....
    }

    private void backgroundWorkB() {

        ....
        //耗時操作
        sHandler.obtainMessage(MSG_ON_B).sendToTarget();
        .....
    }

    @Override
    public void handleMessage(Message msg) {
        switch (msg.what) { //處理各種消息
            case MSG_ON_A:
                break;
            case MSG_ON_B:
                break;
        }

    }
}
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容