MVP目录
什么是MVP架构
mvp是目前使用最为广泛的架构,其本质上是对mvc的升级使其更加适合Android开发,可以是代码结构更为清晰,解耦合,分离了视图逻辑和业务逻辑(便于修改需求).
MVP的核心思想就是分离业务逻辑层,使代码尽可能的解耦合,将视图交给V层,逻辑交给M层,业务交给P层
mvp优点
- 解耦合 : 将业务,逻辑和视图分开,实现代码解耦合
- 代码清晰 : 代码层次分明,数据层,表现层,逻辑层结构清晰
- 方便修改需求: 当需要修改界面时,我们可以只对视图层进行修改,保留数据层
mvp三层含义
M层(model)数据逻辑层,用于操作数据库,对数据进行解析等一系列数据相关操作
P层(presenter)业务逻辑层,管理当前页面的业务逻辑,持有M和V层
V层(view)视图层,只管理数据的展示,布局等视图操作,持有P层
mvp和mvc的不同
mvp与mvc最大的不同在于,mvc架构中M层持有了V层和C层,而且mvc中业务逻辑是放在V层中的,C层(controller)类似于一个路由,只用于触发某种事件或显示哪个view,不管理逻辑,业务和视图.这样一来导致V层中代码量较mvp更大.所以这两种架构其实各有各的好处,在后端代码中我们使用mvc架构更多.当然除了这两种架构以外还有MVVM等其他架构.
mvp模型图

mvc模型图

在mvp中使用LifeCycle绑定生命周期
在mvp架构中,我们需要将V层的生命周期与P层进行绑定,这样我们就可以在v层被销毁时,解除相互引用,避免内存泄漏.而LifeCycle就是google推出的组织架构,可以在任何地方对Activity或者Fragment的生命周期进行监听.所以在mvp中引入这一组织架构,可以使我们的架构变得更为简洁.关于LifeCycle的详细说明,可以参考下面这篇文章.
P层封装
p层中我们需要完成对m层和v层的持有,以及在v层被销毁时解除对m和v层的持有避免内存泄漏.在这里我们通过弱引用构造了一个handler,这个handler就是用于p层与m层之间进行通信的类.通过modelResponse方法接收M层返回的消息.
通过LifeCycle实现P层接口IPresenter
P层接口中我们可以定义一些P层中常用的方法,还需要定义一些绑定V层生命周期的方法.
public interface IPresenter extends LifecycleObserver {
@OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
default void OnCreate(@NonNull LifecycleOwner owner){
}
@OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
default void OnDestroy(@NonNull LifecycleOwner owner){
}
@OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
default void OnPause(@NonNull LifecycleOwner owner){
}
@OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
default void OnResume(@NonNull LifecycleOwner owner){
}
@OnLifecycleEvent(Lifecycle.Event.ON_START)
default void OnStart(@NonNull LifecycleOwner owner){
}
@OnLifecycleEvent(Lifecycle.Event.ON_STOP)
default void OnStop(@NonNull LifecycleOwner owner){
}
@OnLifecycleEvent(Lifecycle.Event.ON_ANY)
default void OnLifeCycleChanged(@NonNull LifecycleOwner owner){
}
}
P层具体实现
/**
* 基础P层
*
* Created by db on 2018/9/22.
*/
public abstract class BasePresenter<M extends BaseModel,V extends IView> implements IPresenter{
public V mView;
public M mModel;
@SuppressLint("HandlerLeak")
public BasePresenter(V view){
this.mView = view;
this.mModel = binModel(getHandler());
}
/**
*我们通过实现IPresenter中的OnDestroy方法来解除持有
*
* @param owner 生命周期管理者
*/
@Override