MVP造成的内存泄漏

作者: 天平GG | 来源:发表于2019-02-19 13:52 被阅读64次

MVP有很多的优点,例如易于维护,易于测试,松耦合,复用性高,健壮稳定,易于扩展等。但是,由于Presenter经常性的需要执行一些耗时操作,那么当我们在操作未完成时候关闭了Activity,会导致Presenter一直持有Activity的对象,造成内存泄漏。
怎么样解决这个问题呢,我们只要在Activity或者Fragment关闭的时候将Presenter中的引用释放掉就可以了,但是如果有所的界面都去操作那样就变得很麻烦,所以我们在BaseActivity或BaseFragment中去操作,具体代码如下:

public abstract class BasePresenter<T> {

    protected Reference<T> mViewRef;//View接口类型弱引用

    public void attachView(T view) {
        mViewRef = new WeakReference<T>(view); //建立关联
    }

    protected T getView() {
        return mViewRef.get();//获取View
    }

    public boolean isViewAttached() {//判断是否与View建立了关联
        return mViewRef != null && mViewRef.get() != null;
    }

    public void detachView() {//解除关联
        if (mViewRef != null) {
            mViewRef.clear();
            mViewRef = null;
        }
    }
}

这里定义了四个方法,View通过泛型传递进来,Presenter对这个View持有弱引用。

public abstract class BaseActivity<V, T extends BasePresenter<V>> extends LibBaseActivity {

    protected T mPresenter;//Presenter对象

    @SuppressWarnings("unchecked")
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mPresenter = createPresenter();//创建Presenter
        mPresenter.attachView((V) this);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        mPresenter.detachView();
    }

    protected abstract T createPresenter();

}

BaseActivity含有两个泛型参数,第一个是View接口类型,第二个是Presenter的具体类型,在onCreate()中创建通过createPresenter创建一个具体的Presenter,在onDestroy()中释放Presenter中的引用。

相关文章

  • MVP造成的内存泄漏

    MVP有很多的优点,例如易于维护,易于测试,松耦合,复用性高,健壮稳定,易于扩展等。但是,由于Presenter经...

  • Android性能-内存泄漏

    泄漏原因: 单例造成的内存泄漏 非静态内部类(匿名类等)创建静态实例造成的内存泄漏 Handler/Thread/...

  • Mvp模式如何管理生命周期

    Mvp模式在封装的时候会造成内存泄漏,因为presenter层,需要做网络请求,所以就需要考虑到网络请求的取消操作...

  • 关于AFNetworking内存泄漏的解决方案

    前言 相信不少喜欢对内存进行优化的开发者都注意到了,使用AFNetworking会造成内存泄漏,当然造成内存泄漏的...

  • Android 优化一: Leakcanary检测内存泄漏汇总

    Leakcanary检测内存泄漏汇总目录介绍:1.什么是内存泄漏2.内存泄漏造成什么影响3.内存泄漏检测的工具有哪...

  • 一些笔试题

    java内存相关 内存泄漏 在计算机科学中,内存泄漏指由于疏忽或错误造成程序未能释放已经不再使用的内存。内存泄漏并...

  • 内存泄漏和内存溢出的区别与解决方式

    内存泄漏(memory leak ) 是指程序在申请内存后,无法释放已申请的内存空间就造成了内存泄漏,一次内存泄漏...

  • 常见的内存泄漏(转载)

    一、静态变量持有 二、单例模式造成 三、非静态内部类创建静态实例可能造成的内存泄漏 四、webview造成内存泄漏...

  • VideoView的内存泄漏问题

    解决内存泄漏之路 一、在XML文件直接用VideoView控件时,很容易造成内存泄漏,最开始出现的内存泄漏如下 谷...

  • app性能优化 - 避免内存泄漏2

    提出问题: Handler造成的内存泄漏问题Handler之所以造成内存泄漏是因为在activity销毁的时候,H...

网友评论

    本文标题:MVP造成的内存泄漏

    本文链接:https://www.haomeiwen.com/subject/bwgxyqtx.html