Android开发之浅淡MVI框架

1,314 阅读4分钟

我正在参与掘金创作者训练营第6期, 点击了解活动详情

Android开发之浅淡MVI框架

前言

在Android开发中有许多框架框架MVCMVPMVVM等,就MVVM框架更是被Google官方推荐,那么为什么还需要MVI框架呢?先卖一个关子,后面再讲,为了我们更好的了解MVI框架,我们先回顾一下其他框架。

MVC

MVC是最新推出的框架主要为以下几个角色

  • View(视图层):在Android就是xml文件和代码创建的View部分
  • Controller(控制层):主要负责业务逻辑,在Android中Activity也属于Controller层,又要添加代码逻辑,又要控制View层显示
  • Model(模型层):主要负责数据的处理,如网络请求、数据库、计算等操作

优点:

  • 耦合性低,视图层和业务层分离,这样就允许更改视图层代码而不用重新编译模型和控制器代码。重用性高

缺点:

  • ViewController连接过于紧密,可读性、健壮性、可拓展性都大打折扣,也不便于测试

MVP

MVP框架在MVC框架上进行了优化,主要一下集合角色:

  • View层:只负责UI相关操作,Activity也属于View层,使用Presenter层进行与Model的交互
  • Presenter层:主要负责业务逻辑,通过接口的形式与View层交互
  • Model层:主要负责数据的处理,如网络请求、数据库、计算等操作

优点:

  • 模型与视图完全分离,我们可以修改视图而不影响模型
  • Presenter 与 View 的交互是通过接口来进行的,有利于添加单元测试

缺点:

  • 随着业务逻辑增多,需要增加大量接口,会有大量繁琐的回调

  • Presenter 里持有了 Activity 对象,所以可能会导致内存泄漏或者view 空指针的风险

MVVM

MVVM框架是把MVP中的Presenter变成了ViewModel,和MVP基本一致,我们看看MVVM中的角色:

  • View层:主要负责UI相关操作,与MVPView层一致
  • ViewModel层:主要负责业务逻辑,View层与Model层的交互
  • Model等:主要负责数据的处理,如网络请求、数据库、计算等操作

MVVM通过DataBinding进行View层与Model层双向绑定,当我们Model层发生数据变化时,自动刷新ViewUI,可以理解为MVP模式的自动化

优点:

  • 利用观察者模式和数据绑定,减少写回调接口的过程,代码和逻辑和更简洁清晰

缺点:

  • 随着后期功能不断增加,ViewModel中的代码量会越来越多

MVI

MVI是什么

MVI是最近被引入Android的。受Cycle.js框架的思路影响,是基于单向圆柱流的原理进行工作的。框架中主要以下面几个角色为主:

  • Model层:这里的Model不是其他框架中的Model层,在MVI框架中表示存储UI的状态

  • View层:在MVIView层主要是接口,负责相应UI的状态

  • Intent层:在MVIIntent(和Android中的Intent不是同一个)主要负责传递UI状态

MVI数据流

当用户进行操作时,程序会以Intent的的形式通知Model层Model层会对这个UI状态做处理在回调View层进行UI的状态刷新,数据永远都是一个环形结构且单向流动,请看下图:

下载 (1).png

MVI的优缺点

优点:

  • UI的所有变化来自State,所以只需聚焦State,架构更简单、易于调试

  • 数据单向流动,很容易对状态变化进行跟踪和回溯

  • State实例都是不可变的,确保线程安全

  • UI只是反应State的变化,没有额外逻辑,可以被轻松替换或复用

缺点:

  • 所有的操作最终都会转换成State,所以当复杂页面的State容易膨胀

  • State是不变的,每当State需要更新时都要创建新对象替代老对象,这会带来一定内存开销

MVI总结

MVI框架是在MVVM框架的基数上,规定了数据的单项流动,类似于FlutterCompose等主流框架的写法,非常适合在UI展示的场景。

每个框架有每个框架的特点和使用场景,找到合适框架才是最好的框架