Android下MVP在项目的实践整理

本文详细介绍了在Android项目中MVP设计模式的实践,包括基类定义、手动添加和移除View引用以避免内存泄漏,以及基于反射的MVP实现方式。通过对Presenter、View和Model的解耦,提高了代码的可读性和可维护性。文中还总结了不同MVP实现方式的优缺点。
摘要由CSDN通过智能技术生成

此项目源码参考:

MVPEx

设计模式讲解参考:

MVC、MVP、MVVM三种区别_Tiger的专栏-CSDN博客​​​​​​
MVP是Google开源的一个设计模式,主要是为了细分视图(View)与模型(Model)的功能,让View只做两件事:

  • 完成用户的交互;
  • 显示界面布局,同时让Model做数据的处理,业务逻辑放到另外的一个类(Presenter)中。

下面做具体分析:

  • M:M层,在项目中负责数据的处理,包括本地数据库查询,网络数据获取都在这一层中完成;
  • View:V层,在项目中是UI模块,也就是各种activity/fragment,负责绘制UI元素、与用户进行交互。
  • P:P层,在项目做为View与Model的桥梁,M跟V层不直接交互,M层在获取到数据之后,传递到P,P层再通过接口回调到View层,同样,View层的点击等事件,通过P层去通知M层去处理。

如下图所示:

这里写图片描述

 1.MVP设计模式实践

1.1MVP基类定义

MVP设计模式下P将M和V完全隔离开,P和V是双向通信,P和M之间也是双向通信,采用面向接口编程,Fragment/Activity属于V层,Fragment/Activity会实现V接口,P通过持有的V实现通知Fragment/Activity需要进行UI更新,P间接间接持有Fragment/Activity,可能会造成内存泄露,那么如何解决呢,接下来讲解一下项目中的实践?

定义Presenter接口

我们在定义Presenter时会定义attachView()和detachView方法,然后在Activity/Fragment下onCreate()方法调用Presenter.attachView()关联持有的V(Activity/Fragment),在onDestroy()方法下调用Presenter.detachView()取消关联持有的V(Activity/Fragment),从而解决内存泄漏问题

public interface MvpPresenter<V extends MvpView> {
    @UiThread
    void attachView(V view);

    @UiThread
    void detachView(boolean retainInstance);
}

Presenter接口实现

Presenter持有V的弱引用

public class MvpBasePresenter<V extends MvpView> implements MvpPresenter<V>{
    private WeakReference<V> viewRef;

    public void MvpBasePresenter(){
    }

    @UiThread
    public void attachView(V view) {
        this.viewRef = new WeakReference(view);
    }

    @UiThread
    public V getView(){
        return this.viewRef == null ? null : (V)this.viewRef.get();
    }

    @UiThread
    public void detachView(boolean retainInstance) {
        if(this.viewRef.get() != null){
            this.viewRef.clear();
            this.viewRef = null;
        }
    }
}

定义Activity基类

添加和移除Presenter对V的引用

public abstract class BaseMvpActiv
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值