MVP学习笔记

Sorry,引用文章的地址给忘了哪几个了。忘原作者见谅。

M:Model,关注数据处理
V:View,关注处理视图的可视化及与用户交互
P:Presenter,关注业务处理

###在MVP模式里通常包含4个要素:
(1)View:负责绘制UI元素、与用户进行交互(在Android中体现为Activity);
(2)View interface:需要View实现的接口,View通过View interface与Presenter进行交互,降低耦合,方便进行单元测试;
(3)Model:负责存储、检索、操纵数据(有时也实现一个Model interface用来降低耦合);
(4)Presenter:作为View与Model交互的中间纽带,处理与用户交互的负责逻辑。

###总结:

V:持有P的引用,项目规格不大,可以不使用P的接口
P:持有M、V的接口实现对象

**Note:** 
防止Activity或Fragment声明周期结束后,一般执行耗时操作的Presenter层因为持有对Activity或Fragment的强引用,导致内存泄漏。

**处理方法:**
1.  解除绑定关系,在V层生命周期的OnDestory()中,调用P层持有的V,将其置空,解除和P层的关联。
2.  为了弥补在特殊情况下,如系统突然回收内存,导致Activity的onStop、onDestory没有执行便被干掉,造成上一种方式解除绑定代码没有被执行,特还需要使用软引用或弱引用。


/**
 * code from Android源码设计模式
 */
public abstract class BasePresenter<T> {
    protected Reference<T> mViewRef;

    public void attachView(T view) {
        mViewRef = new WeakReference<T>(view);
    }

    protected T getView() {
        return mViewRef.get();
    }

    protected void detachView() {
        if (mViewRef != null) {
            mViewRef.clear();
            mViewRef = null;
        }
    }
}

public abstract class MVPBaseActivity<V, T extends BasePresenter<V>> extends AppCompatActivity {
    BasePresenter mPresenter;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mPresenter = createPresenter();
        mPresenter.attachView((V) this);
    }

    public abstract T createPresenter();

    @Override
    public void onDestroy() {
        mPresenter.detachView();
    }
}
文章目录
|