Handler的封装,在activity和fragment中使用防止泄露

1、创建抽象的BaseHandler类继承Handler

/**
 * Created by zhaoliang on 2018/9/20
 */

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, Constant.ACTIVITY_GONE);
        } else if (fragmentWeakReference == null || fragmentWeakReference.get() == null || fragmentWeakReference.get().isRemoving()) {
            //确认判断Fragment不可用
            LogUtil.i("Fragment is gone");
            handleMessage(msg, Constant.ACTIVITY_GONE);
        } else {
            handleMessage(msg, msg.what);
        }
    }

    /**
     * 抽象方法用户实现,用来处理具体的业务逻辑
     *
     * @param msg
     * @param what {@link What}
     */
    public abstract void handleMessage(Message msg, int what);

}

//复制时报错的是自己定义的静态常量

2、在fragment中的使用

//1、继承BaseHandler
private class NoLeakHandler extends BaseHandler {//继承抽象类复写方法

        public NoLeakHandler(Fragment fragment) {
            super(fragment);
        }

        @Override
        public void handleMessage(Message msg, int what) {
            if (msg.what == 1) {
                setData();
                num++;
                if (flag) {
                    //开启动画
                    start();
                    flag = false;
                } else {
                    //终止动画
                    end();
                    flag = true;
                }
            }
        }
    }
//2、初始化
NoLeakHandler handler = new NoLeakHandler(this);


//3、使用
 handler.sendMessage(msg);
//4、在onDestroy()方法中进行移除handler
handler.removeCallbacksAndMessages(null);

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值