MVC
首先来说下MVC,MVC就是model、view、controller。其中model数据的实体类,view用于视图的展示,controller负责处理用户操作、用来协调model和view。
Android最基本的方式就是MVC,即xml文件相当于view,activity相当于controller,实体类、SP等数据相当于model。
但是在Android中,由于Android设计上的原因,MVC根本就不适合Android,Android的Activity,他又是负责控件的初始化和加载,也就是承担了view层的功能,又是负责了UI交互逻辑以及UI和model的绑定,也就是承担了controller的功能。所以使用MVC写到最后,会导致Activity越来越重,而且view和controller越来越揉在一起。因此,传统的代码结构只能勉强称为MV 或者是MC,如果算上xml 的布局文件,才能牵强的称为MVC 结构。

- 用户 Event(事件)会导致 Controller 改变 Model 或 View 或同时改变两者。
- 只要 Controller 改变了 Model 的数据或属性,所有依赖的 View 都会自动更新。
- 类似的,只要 Controller 改变了 View ,View 会从潜在的 Model 中获取数据进行更新。
MVP
MVP 模式所做的事情很简单,就是将业务逻辑和视图逻辑抽象到接口中。
- Presenter——交互中间人
主要作为沟通View和Model的桥梁,他从Model层检索数据后,返回给View层,使得View和Model之间没有耦合,也将业务逻辑从View角色中抽离出来 - View——用户界面
View就是指Activity、Fragment这些,他们含有一个Presenter成员变量。通常View需要实现一个逻辑接口,将View上的操作转交给Presenter进行实现,最后Presenter调用View逻辑接口将结果返回给View元素 - Model——数据的存取
Model是提供数据的存取功能的。Presenter需要通过Model层存储、获取数据,Model就像一个数据仓库。
Presenter就是中介,由他去管理View和Model中的通信,他会持有Model的对象和View的接口的对象,然后在构造函数中需要将View的接口对象传进来,通过这个接口与View进行通信,通过View中需要去构造一个Presenter,然后需要响应事件的时候调用Presenter对象对应的方法,Presente再调用Model层去获取数据等待数据返回后再通过接口去让View显示。

但MVP也存在一些弊端:
- Presenter(以下简称P)层与View(以下简称V)层是通过接口进行交互的,接口粒度不好控制。粒度太小,就会存在大量接口的情况,使代码太过碎版化;粒度太大,解耦效果不好。同时对于UI的输入和数据的变化,需要手动调用V层或者P层相关的接口,相对来说缺乏自动性、监听性。如果数据的变化能自动响应到UI、UI的输入能自动更新到数据,那该多好!
- MVP是以UI为驱动的模型,更新UI都需要保证能获取到控件的引用,同时更新UI的时候要考虑当前是否是UI线程,也要考虑Activity的生命周期(是否已经销毁等)。
- V层与P层还是有一定的耦合度。一旦V层某个UI元素更改,那么对应的接口就必须得改,数据如何映射到UI上、事件监听接口这些都需要转变,牵一发而动全身。如果这一层也能解耦就更好了。
主要区别
在 MVC 中:
- View 可以与 Model 直接交互;
- Controller 可以被多个 View 共享;
- Controller 可以决定显示哪个 View。
在 MVP 中:
- View 不直接与 Model 交互;
- Presenter 与 View 通过接口来交互,更有利于添加单元测试;
- 通常 View 与 Presenter 是一对一的,但复杂的 View 可能绑定多个 Presenter 来处理;
- Presenter 也可以直接进行 View 上的渲染。
防止内存泄漏
其实上面的代码存在内存泄漏的风险。试想一下,如果在点击 Button 之后,Model 获取到数据之前,退出了 Activity,此时由于 Activity 被 Presenter 引用,而 Presenter 正在进行耗时操作,会导致 Activity 的对象无法被回收,造成了内存泄漏,解决的方式很简单,在 Activity 退出的时候,把 Presenter 对中 View 的引用置为空即可。
// Presenter.java
public void detachView() {
view = null;
}
// MVPActivity.java
@Override
protected void onDestroy() {
super.onDestroy();
presenter.detachView();
}
MVVM

- Model:和MVC、MVP中的Model层差别不大,都是用来管理数据的,负责从本地获取数据或者从网络获取数据
- View:也是和MVC、MVP中的View层差不多,只处理界面的逻辑,不参与业务逻辑
- ViewModel:ViewModel除了作为View和Model层的中间人之外,它内部还会多一个Binder,这个Binder就是ViewModel的心脏,为双向绑定提供支持。
View与ViewModel之间的交互
他们之间主要是通过一个Binder进行事件交互,该Binder通过双向绑定将View与ViewModel中对于数据操作的部分进行链接,当数据更新时自动更新到View层上,通过View层有事件也会自动通知我们的ViewModel。而Android中的Binder就是DataBinding。
4930





