BaseHandler的封裝, 處理handler中的內存泄漏


package de.bvb.study.common;

/**
 * 用於規范 Message.what此屬性,避免出現魔法數字
 */
public final class What {

    public static final int ZERO = 0;
    public static final int ONE = 1;

    /** 標記異步操作返回時目標界面已經消失時的處理狀態 */
    public static final int ACTIVITY_GONE = -1;
}
package de.bvb.study.common;

import android.app.Activity;
import android.os.Handler;
import android.os.Message;
import android.support.v4.app.Fragment;

import java.lang.ref.WeakReference;

import de.bvb.study.util.LogUtil;

/**
 * handler包裝類
 */
public abstract class BaseHandler extends Handler {

    protected WeakReference<Activity> activityWeakReference;
    protected WeakReference<Fragment> fragmentWeakReference;

    private BaseHandler() {}//構造私有化,讓調用者必須傳遞一個Activity 或者 Fragment的實例

    public BaseHandler(Activity activity) {
        this.activityWeakReference = new WeakReference<>(activity);
    }

    public BaseHandler(Fragment fragment) {
        this.fragmentWeakReference = new WeakReference<>(fragment);
    }

    @Override
    public void handleMessage(Message msg) {
        if (activityWeakReference == null || activityWeakReference.get() == null || activityWeakReference.get().isFinishing()) {
            // 確認Activity是否不可用
            LogUtil.i("Activity is gone");
            handleMessage(msg, What.ACTIVITY_GONE);
        } else if (fragmentWeakReference == null || fragmentWeakReference.get() == null || fragmentWeakReference.get().isRemoving()) {
            //確認判斷Fragment不可用
            LogUtil.i("Fragment is gone");
            handleMessage(msg, What.ACTIVITY_GONE);
        } else {
            handleMessage(msg, msg.what);
        }
    }

    /**
     * 抽象方法用戶實現,用來處理具體的業務邏輯
     *
     * @param msg
     * @param what {@link What}
     */
    public abstract void handleMessage(Message msg, int what);

}
package de.bvb.study.ui.activity;

import android.app.Activity;
import android.os.Bundle;
import android.os.Message;

import de.bvb.study.common.BaseHandler;
import de.bvb.study.common.What;

public class LoginActivity extends BaseActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        new Thread(new Runnable() {
            @Override
            public void run() {
                handler.obtainMessage(What.ZERO, "data 0").sendToTarget();
            }
        }).start();

        new Thread(new Runnable() {
            @Override
            public void run() {
                handler.obtainMessage(What.ONE, "data 1").sendToTarget();
            }
        }).start();

    }

    MyHandler handler = new MyHandler(this);
    private static class MyHandler extends BaseHandler {

        public MyHandler(Activity activity) {
            super(activity);
        }

        @Override
        public void handleMessage(Message msg, int what) {
            switch (what) {
                case What.ZERO:
                    break;
                case What.ONE:
                    break;
                case What.ACTIVITY_GONE:
                    break;
            }
        }
    }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM