Please enable JavaScript.
Coggle requires JavaScript to display documents.
Android 常见开发模式 (MVVM基础 (ViewModel (负责完成View与Model间的交互, 负责业务逻辑), google官方…
Android 常见开发模式
MVVM基础
Model
实体模型
ViewModel
负责完成View与Model间的交互
负责业务逻辑
View
对应Activity和XML
负责View的绘制以及与用户交互
google官方
使用误区
ViewModels不可替代onSaveInstanceState()
区分
ViewModel保存
Activity UI 所需要的数据
所有用户信息(User Id,name...)
onSaveInstanceState()保存
在紧急情况下,Activity 重载的数据
User Id
原因
ViewModel在应用程序被系统停止时销毁
禁止传Context给ViewModel
原因
Activity(旋转屏幕)等可能会被销毁重建多次
ViewModel不同于UI组件
解决办法
继承 AndroidViewModel 获得Context
ViewModel不应该有Activity、Fragment和View的引用
ViewModel特点
ViewModels + LiveData 构成响应式 UI
共享多个Fragment数据
MVC
Model
实体模型(作用)
数据状态变化
数据的获取、存储
View
XML布局文件
Controller
对应于Activity
处理数据、业务
UI
缺点
View的视图功能太弱
Activity充当View和Controller角色
View的处理逻辑在Activity
MVP
Model
实体模型
Presenter
作用
负责完成View与Model间的交互和业务逻辑
View
对于Activity、XML
作用
负责View的绘制以及与用户的交互
优缺点
优点
视图操作和业务逻辑解耦
Presenter与真正的View层进行解耦
缺点
需要手动调用V层或者P层相关的接口
缺乏自动性、监听性
某块多时,代码量爆炸
以UI和事件为驱动的传统模型
数据无法驱动UI
Presenter层与View层是通过接口进行交互的
粒度太小,存在大量接口,代码碎版化
粒度太大,解耦效果不好
V层与P层还是有一定的耦合度
V层某个UI元素更改,对应的接口就必须得改
复杂 业务 导致P层太大
代码臃肿
MVVM 进阶
设计思想
高效灵活
依赖属性(Dependency Property)
数据绑定(Data Binding)
命令(Command)
路由事件(Routed Event)
与MVP类似
优点
数据驱动
数据变化后会自动更新UI
UI的改变自动反馈到数据层
更新UI
工作线程直接修改,不用考虑主线程
低耦合度
数据是独立于UI
ViewModel只需要关注数据和业务逻辑
团队协作
View
专门的UI处理
ViewModel
处理业务和数据
松散耦合。完全由两个人分工来做,效率高
可复用性
一个ViewModel可以复用到多个View中
单元测试
低耦合更适合单元测试
构建MVVM应用框架
如何分工
ViewModel
与View层相反
ViewModel只做和业务逻辑和业务数据相关的事
原理
DataBinding双向绑定
获取View层反馈给ViewModel
统一化,BindingAdapter常用的事件做了封装
一个个事件封装成一个个Command
一个ReplyCommand回复多个Command
ViewModel 不做和UI相关的事
View
View层只做UI相关的工作
View层不做任何业务逻辑
Model
数据的获取、存储、数据状态变化
Model提供数据获取接口供ViewModel调用
如何协作
ViewModel与View的协作
绑定方式
数据绑定
DataBinding
简单定义ObservableField
数据和控件绑定,如:TextView
命令绑定
把数据源和布局模板绑定到一个ListView
ViewModel组成部分
Data Field (数据绑定)
含义:绑定到控件上的ObservableField字段
可以声明一个ViewStyle类包裹起来,增加逻辑性
Command (命令绑定)
含义:对事件的处理(下拉刷新、加载更多、点击等)
Listener 其实就是 Command
Command只是对UI事件的一层隔离UI层的封装
应该专注业务逻辑和数据处理
需要多个 Listener 可以添加
Model (数据源 Java Bean)
Child ViewModel (子ViewModel)
建议
一个页面业务非常复杂,不要把所有逻辑都写在一个ViewModel
ViewModel不要引入太多的成员变量
成员变量最好只有自带的5种
应用场景
AdapterView,如ListView RecyclerView、ViewPager
每个Item其实就对应于一个ViewModel
Activity有多个 Fragment等
Context
网络请求绑定到当前页面的生命周期中
用Messenger需要Context,它可让两个ViewModel联系
Google禁止把Context 传给 ViewModel
ViewModel与Model的协作
1 ViewModel通过传参数到Model层获取网络数据
2 Model的部分数据映射到ViewModel的一些字段
3 在ViewModel保留这个Model的引用
ViewModel与ViewModel的协作
Messenger实现ViewModel和ViewModel的通信
Messenger可以理解是一个全局消息通道