Android架构

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 改变 ModelView 或同时改变两者。
  • 只要 Controller 改变了 Model 的数据或属性,所有依赖的 View 都会自动更新。
  • 类似的,只要 Controller 改变了 ViewView 会从潜在的 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 交互;
  • PresenterView 通过接口来交互,更有利于添加单元测试;
  • 通常 ViewPresenter 是一对一的,但复杂的 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。

评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值