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 BaseHandlerCallBack callBack;

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

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

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

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

class BaseHandler(c: AppCompatActivity, private val callBack: BaseHandlerCallBack) : Handler() {

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

    override fun handleMessage(msg: Message) {
        super.handleMessage(msg)
        val c = act.get()
        if (c != null) {
            callBack.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;
        }
    }
}

完事

发布了103 篇原创文章 · 获赞 31 · 访问量 5万+

猜你喜欢

转载自blog.csdn.net/sinat_38184748/article/details/102580156
今日推荐