Android 解决Handler内存泄漏问题

前言

最近在维护老项目的时候发现,使用handler延时处理的事件再activity结束后仍旧再执行,导致activity再次被创建,或activity迟迟无法正常结束,或者直接崩溃。好吧,说了这么久的内存泄漏终于要和它面对面刚了

更多描述

Android中Handler导致内存泄漏的原理分析

解决方法

自定义弱引用Handler

我这边使用了 AppCompatActivity ,你可以根据自己所使用的进行修改调整

/**
 * 封装Handler子类
 * $ 解决handler内存泄漏问题
 *
 * @author D10NG
 * @date on 2019-09-28 11:11
 */
public class BaseHandler extends Handler {

    final WeakReference<AppCompatActivity> act;
    final WeakReference<BaseHandlerCallBack> callBack;

    public BaseHandler(AppCompatActivity c, BaseHandlerCallBack b) {
        act = new WeakReference<>(c);
        callBack = new WeakReference<>(b);
    }

    @Override
    public void handleMessage(Message msg) {
        super.handleMessage(msg);
        AppCompatActivity c = act.get();
        BaseHandlerCallBack b = callBack.get();
        if (c != null && b != null) {
            b.callBack(msg);
        }
    }

    public interface BaseHandlerCallBack {
        void callBack(Message msg);
    }
}

----------------- 2019 - 10 - 24 更新 -----------------
Kotlin版

class BaseHandler(c: AppCompatActivity, b: BaseHandlerCallBack) : Handler() {

    private val act: WeakReference<AppCompatActivity> = WeakReference(c)
    private val callBack: WeakReference<BaseHandlerCallBack> = WeakReference(b)

    override fun handleMessage(msg: Message) {
        super.handleMessage(msg)
        val c = act.get()
        if (c != null) {
            callBack.get()?.callBack(msg)
        }
    }

    interface BaseHandlerCallBack {
        fun callBack(msg: Message)
    }
}

----------------- 2019 - 10 - 24 更新 -----------------

创建BaseActivity

public abstract class BaseActivity extends AppCompatActivity implements BaseHandler.BaseHandlerCallBack {
    /** handler */
    protected BaseHandler mHandler;

    @Override
    public void callBack(Message msg) {
        // handler消息回调
    }
}

继承使用

public class MainActivity extends BaseActivity {

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.act_main);
        // 发送
        mHandler.sendEmptyMessage(0);
    }
    
    @Override
    public void callBack(Message msg) {
        super.callBack(msg);
        switch (msg.what) {
            case 0:
                // do
                break;
            case 1:
                // do
                break;
            case 2:
                // do
                break;
        }
    }
}

完事

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值