文章目录

  • 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实现相关推荐

  1. android组件化架构 书,Android MVVM组件化架构方案

    MVVMHabitComponent 关于Android的组件化,相信大家并不陌生,网上谈论组件化的文章,多如过江之鲫,然而一篇基于MVVM模式的组件化方案却很少.结合自身的调研和探索,在此分享一篇基 ...

  2. 如何构建Android MVVM 应用框架

    本文转载自[http://tech.meituan.com/android_mvvm.htmlhmsr=toutiao.io&utm_medium=toutiao.io&utm_sou ...

  3. Android MVVM框架搭建(十)Hilt、ViewBinding、Activity Result API

    Android MVVM框架搭建(十)Hilt.ViewBinding.Activity Result API 前言 正文 一.依赖 二.Hilt使用 1. Hilt 应用类 2. ViewModel ...

  4. Android MVVM框架搭建(八)高德地图定位、天气查询、BottomSheetDialog

    Android MVVM框架搭建(八)高德地图定位.天气查询.BottomSheetDialog 前言 正文 一.集成SDK 二.基础配置 ① 权限配置 ② 配置Key 三.显示地图 ① MapFra ...

  5. Android MVVM框架搭建(三)MMKV + Room + RxJava2

    Android MVVM框架搭建(三)MMKV + Room + RxJava2 前言 正文 一.添加依赖 二.MMKV 1. 初始化 2. 数据存取 3. 使用 三.Room 1. @Entity ...

  6. Android MVVM封装,MVVM: 这是一个android MVVM 框架,基于谷歌dataBinding技术实现

    MVVM 这是一个android MVVM 框架,基于谷歌dataBinding技术实现.dataBinding 实现的 V 和 VM的关联:使用IOC架构实现了 M 和 V的关联. 框架具有以下功能 ...

  7. android mvvm官方文档,MVVM: 这是一个android MVVM 框架,基于谷歌dataBinding技术实现

    MVVM 这是一个android MVVM 框架,基于谷歌dataBinding技术实现.dataBinding 实现的 V 和 VM的关联:使用IOC架构实现了 M 和 V的关联. 框架具有以下功能 ...

  8. android+捕获google账户+cancel按钮,MVVM: 这是一个android MVVM 框架,基于谷歌dataBinding技术实现...

    MVVM 这是一个android MVVM 框架,基于谷歌dataBinding技术实现.dataBinding 实现的 V 和 VM的关联:使用IOC架构实现了 M 和 V的关联. 框架具有以下功能 ...

  9. Android MVVM架构

    1.MVC,MVP,MVVVM 1.1什么是MVVM 1.MVVM,是Model-View-ViewModel的简写,是M-V-VM三部分组成.它本质上就是MVC 的改进 版.MVVM 就是将其中的V ...

  10. Android MVVM框架搭建(二)OKHttp + Retrofit + RxJava

    Android MVVM框架搭建(二)Retrofit + RxJava 前言 正文 一.引入依赖 二.工具类 三.构建网络框架 1. Base 2. 异常处理 3. 拦截器 4. 网络请求服务 四. ...

最新文章

  1. SQL Server 2005 18452登录错误 的解决方法
  2. 送一台27寸高清显示器
  3. IOS笔记-C语言中的指针与数组
  4. Linux下 jenkins的安装
  5. python装饰器_python装饰器完全指南之一
  6. 什么是php数组,php 数组写法是什么
  7. 历经5代跨越25年的RTC架构演化史
  8. java jndi tomcat_tomcat下jndi的三种配置方式
  9. Java高并发编程详解-代码在本地
  10. k8s学习:部署 PHP + Redis 留言薄
  11. c#获取网口扫描枪数据
  12. PROE4.0抄数逆向点造型高级曲面建模教程
  13. php laravel日志报错,Laravel 文档阅读:错误 日志记录
  14. Redis集群之主从模式
  15. 2018-4-30-win2d-CanvasRenderTarget-vs-CanvasBitmap
  16. MAC下Apktool、dex2jar、jd-gui的安装和反编译、回编译、重新签名简单使用
  17. 计算机公共基础知识(N-S图,DFD图,PAD图,程序流程图,E-R图)
  18. 解读人工智能的2021:回顾那些激动人心的重大突破
  19. 【AI面试】L1 loss、L2 loss和Smooth L1 Loss,L1正则化和L2正则化
  20. ASP.NET圣贤图书馆管理系统动态网站

热门文章

  1. 历史回顾:全球股灾大放送
  2. java双向链表详解
  3. java微信红包案例_Java--案例--微信发红包
  4. nyoj 1204魔法少女
  5. 【聚类】五种主要聚类算法
  6. java.lang.SecurityException: Prohibited package name: java.com.xx异常抛出
  7. 不就是个短信登录API嘛,有这么复杂吗?(转载)
  8. 自己动手写贪吃蛇AI——附源码和程序
  9. 13980个性桌面导航
  10. Hystrix vs Sentinel