Android MVVM实现
文章目录
- Android架构分类
- MVC
- MVP
- MVVM
- MVVM实现
- Jetpack MVVM结构
- 简单实现
- Model层设计
- View层设计
- ViewModel层设计
Android架构分类
MVC
MVC:Model-View-Controller
角色 | 说明 |
---|---|
Model 模型层 | 负责数据获取和处理,如:网络请求、数据库处理、IO操作等 |
View 视图层 | 负责界面展示,即XML布局 |
Controller 控制层 | 负责业务逻辑处理,通常由Activity/Fragment承担 |
事件流向
View层收到用户操作事件,通知Controller层进行业务逻辑处理,Controller层通知Model层处理数据,Model层更新数据后通知到View层,View层更新界面。
缺点
- Activity/Fragment需要同时承担View和Controller,导致Activity/Fragment代码臃肿,维护不便。
- Model和View没有解耦,View的修改会影响Controller和Model。
MVP
MVP:Model-View-Presenter
角色 | 说明 |
---|---|
Model 模型层 | 负责数据处理 |
View 视图层 | 负责界面展示逻辑,即Activity/Fragment |
Presenter 通知层 | 负责业务逻辑处理,连接Model和View |
事件流向
View层接收用户操作事件,通知到Presenter层进行业务逻辑处理,再通知Model层进行数据处理,Model将处理的数据传递到Presenter,Presenter再通知到View更新界面。
优点
- View责任明确,Presenter负责业务逻辑处理。
- Model与View完全解藕。
缺点
- View和Presenter之前互相持有,没有解决耦合问题。
- 会引入大量View、Presenter接口,增加代码复杂度。
MVVM
MVVM:Model-View-ViewModel
角色 | 说明 |
---|---|
Model 模型层 | 负责数据处理 |
View 视图层 | 负责界面展示逻辑,即Activity/Fragment |
ViewModel 视图模型层 | 负责业务逻辑处理、数据驱动,通常由ViewModel+LiveData |
什么是数据绑定:表现的数据发生变化,会自动更新内存中实际的数据
事件流向
View层收到用户操作事件,使用ViewModel层进行业务逻辑处理,通知Model层数据处理,Model将数据传递到ViewModel,ViewModel自动更新到View刷新界面。
优点
- 解藕更彻底,ViewModel不持有View。
MVVM实现
Jetpack MVVM结构
Jetpack是google提供并推荐实现MVVM的方式。
简单实现
功能说明:点击按钮获取用户信息并展示在界面。
Model层设计
public class UserInfo {private String name;private int age;private String address;//省略构造器、get/set
}
public interface Callback<T> {void onSuccess(T t);void onFailure(String msg);
}
public class UserInfoModel {public void getUserInfo(Callback<UserInfo> callback) {new Handler(Looper.getMainLooper()).postDelayed(new Runnable() {@Overridepublic void run() {UserInfo userInfo = new UserInfo("Tom", 18, "beijing");callback.onSuccess(userInfo);}}, 2000);}
}
View层设计
public class MainActivity extends AppCompatActivity {private UserInfoViewModel userInfoViewModel;private ProgressDialog progressDialog;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);ActivityMainBinding viewBinding = ActivityMainBinding.inflate(getLayoutInflater());setContentView(viewBinding.getRoot());userInfoViewModel = new UserInfoViewModel();userInfoViewModel.getLoadingLiveData().observe(this, new Observer<Boolean>() {@Overridepublic void onChanged(Boolean aBoolean) {if (aBoolean) {showLoading();} else {hideLoading();}}});userInfoViewModel.getUserInfoLiveData().observe(this, new Observer<UserInfo>() {@Overridepublic void onChanged(UserInfo userInfo) {viewBinding.tvUserInfo.setText(String.format("姓名:%s,年龄:%d,地址:%s",userInfo.getName(), userInfo.getAge(), userInfo.getAddress()));}});viewBinding.btn.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {userInfoViewModel.getUserInfo();}});}public void showLoading() {if (progressDialog == null) {progressDialog = new ProgressDialog(this);progressDialog.setMessage("正在加载");}progressDialog.show();}public void hideLoading() {progressDialog.hide();}
}
ViewModel层设计
public class UserInfoViewModel extends ViewModel {private MutableLiveData<UserInfo> userInfoLiveData;private MutableLiveData<Boolean> loadingLiveData;private final UserInfoModel model;public UserInfoViewModel() {userInfoLiveData = new MutableLiveData<>();loadingLiveData = new MutableLiveData<>();model = new UserInfoModel();}public void getUserInfo() {loadingLiveData.setValue(true);model.getUserInfo(new Callback<UserInfo>() {@Overridepublic void onSuccess(UserInfo userInfo) {loadingLiveData.setValue(false);userInfoLiveData.setValue(userInfo);}@Overridepublic void onFailure(String msg) {loadingLiveData.setValue(false);}});}public MutableLiveData<UserInfo> getUserInfoLiveData() {return userInfoLiveData;}public MutableLiveData<Boolean> getLoadingLiveData() {return loadingLiveData;}
}
Android MVVM实现相关推荐
- android组件化架构 书,Android MVVM组件化架构方案
MVVMHabitComponent 关于Android的组件化,相信大家并不陌生,网上谈论组件化的文章,多如过江之鲫,然而一篇基于MVVM模式的组件化方案却很少.结合自身的调研和探索,在此分享一篇基 ...
- 如何构建Android MVVM 应用框架
本文转载自[http://tech.meituan.com/android_mvvm.htmlhmsr=toutiao.io&utm_medium=toutiao.io&utm_sou ...
- Android MVVM框架搭建(十)Hilt、ViewBinding、Activity Result API
Android MVVM框架搭建(十)Hilt.ViewBinding.Activity Result API 前言 正文 一.依赖 二.Hilt使用 1. Hilt 应用类 2. ViewModel ...
- Android MVVM框架搭建(八)高德地图定位、天气查询、BottomSheetDialog
Android MVVM框架搭建(八)高德地图定位.天气查询.BottomSheetDialog 前言 正文 一.集成SDK 二.基础配置 ① 权限配置 ② 配置Key 三.显示地图 ① MapFra ...
- Android MVVM框架搭建(三)MMKV + Room + RxJava2
Android MVVM框架搭建(三)MMKV + Room + RxJava2 前言 正文 一.添加依赖 二.MMKV 1. 初始化 2. 数据存取 3. 使用 三.Room 1. @Entity ...
- Android MVVM封装,MVVM: 这是一个android MVVM 框架,基于谷歌dataBinding技术实现
MVVM 这是一个android MVVM 框架,基于谷歌dataBinding技术实现.dataBinding 实现的 V 和 VM的关联:使用IOC架构实现了 M 和 V的关联. 框架具有以下功能 ...
- android mvvm官方文档,MVVM: 这是一个android MVVM 框架,基于谷歌dataBinding技术实现
MVVM 这是一个android MVVM 框架,基于谷歌dataBinding技术实现.dataBinding 实现的 V 和 VM的关联:使用IOC架构实现了 M 和 V的关联. 框架具有以下功能 ...
- android+捕获google账户+cancel按钮,MVVM: 这是一个android MVVM 框架,基于谷歌dataBinding技术实现...
MVVM 这是一个android MVVM 框架,基于谷歌dataBinding技术实现.dataBinding 实现的 V 和 VM的关联:使用IOC架构实现了 M 和 V的关联. 框架具有以下功能 ...
- Android MVVM架构
1.MVC,MVP,MVVVM 1.1什么是MVVM 1.MVVM,是Model-View-ViewModel的简写,是M-V-VM三部分组成.它本质上就是MVC 的改进 版.MVVM 就是将其中的V ...
- Android MVVM框架搭建(二)OKHttp + Retrofit + RxJava
Android MVVM框架搭建(二)Retrofit + RxJava 前言 正文 一.引入依赖 二.工具类 三.构建网络框架 1. Base 2. 异常处理 3. 拦截器 4. 网络请求服务 四. ...
最新文章
- SQL Server 2005 18452登录错误 的解决方法
- 送一台27寸高清显示器
- IOS笔记-C语言中的指针与数组
- Linux下 jenkins的安装
- python装饰器_python装饰器完全指南之一
- 什么是php数组,php 数组写法是什么
- 历经5代跨越25年的RTC架构演化史
- java jndi tomcat_tomcat下jndi的三种配置方式
- Java高并发编程详解-代码在本地
- k8s学习:部署 PHP + Redis 留言薄
- c#获取网口扫描枪数据
- PROE4.0抄数逆向点造型高级曲面建模教程
- php laravel日志报错,Laravel 文档阅读:错误 日志记录
- Redis集群之主从模式
- 2018-4-30-win2d-CanvasRenderTarget-vs-CanvasBitmap
- MAC下Apktool、dex2jar、jd-gui的安装和反编译、回编译、重新签名简单使用
- 计算机公共基础知识(N-S图,DFD图,PAD图,程序流程图,E-R图)
- 解读人工智能的2021:回顾那些激动人心的重大突破
- 【AI面试】L1 loss、L2 loss和Smooth L1 Loss,L1正则化和L2正则化
- ASP.NET圣贤图书馆管理系统动态网站