Android MVVM

news/2024/10/24 11:11:48

Android MVVM

介绍

MVVM(Model-View-ViewModel)是Android开发中常用的一种架构模式。它将应用程序的逻辑分离为三个主要部分:Model(模型)、View(视图)和ViewModel(视图模型),从而使代码更清晰、更易于维护。

1. Model(模型)

Model代表应用程序的数据和业务逻辑。它负责处理数据的获取、存储和更新,例如从数据库中检索数据或通过网络请求获取数据。Model通常是与UI无关的部分,因此可以独立测试和复用。

2. View(视图)

View是用户界面(UI)的部分,负责展示数据并与用户进行交互。View直接与XML布局文件相关联。它通过监听用户的操作(如点击按钮)触发相应的操作,但不直接处理业务逻辑。View通常会绑定ViewModel中的数据,并通过观察者模式自动更新UI。

3. ViewModel(视图模型)

ViewModel是连接Model和View的桥梁。它持有Model中的数据,并将这些数据暴露给View。ViewModel的主要职责是处理UI相关的数据准备工作,将数据从Model转换为View可以直接使用的形式。同时,ViewModel还会处理一些简单的逻辑,但不涉及UI操作。它通常使用LiveDataStateFlow等观察者模式来监视数据的变化,当数据发生变化时,自动通知View进行更新。

MVVM的优势

  1. 解耦性:Model、View和ViewModel彼此独立,降低了模块之间的耦合度,方便单元测试和模块化开发。
  2. 可维护性:由于逻辑与UI分离,代码更清晰、易于维护,降低了后期维护和扩展的成本。
  3. 数据绑定:通过使用数据绑定(DataBinding)库或LiveData,View和ViewModel之间可以实现自动更新,减少了手动刷新UI的代码量。

MVVM的实现

在Android中实现MVVM通常需要结合以下组件:

  • LiveData:一种可观察的数据持有类,View可以订阅它,当数据变化时,UI会自动更新。
  • ViewModel:通过ViewModel类来存储和管理与UI相关的数据。ViewModel的生命周期与ActivityFragment相同,可以在配置更改(如屏幕旋转)时保留数据。
  • DataBinding(可选):通过数据绑定库,将XML布局文件与ViewModel中的数据直接绑定,实现更简洁的UI更新。

示例

1. 开启数据绑定

build.gradle文件中启用数据绑定:

android {dataBinding {enabled = true}
}

2. Model(模型)

CountModel类表示计数器的数据模型。它包含计数值和相应的增减方法:

public class CountModel {int count;public CountModel(int count) {this.count = count;}public int getCount() {return count;}public void increment() {count++;}public void decrement() {count--;}
}

3. View(XML布局)

在XML布局文件中使用数据绑定,绑定ViewModel中的数据和方法到UI组件:

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"><data><import type="com.jing.countmvvmdemo.viewModel.CountViewModel"/><variablename="countViewModel"type="com.jing.countmvvmdemo.viewModel.CountViewModel" /></data><LinearLayoutandroid:id="@+id/main"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"tools:context=".MainActivity"><TextViewandroid:id="@+id/countTextView"android:layout_width="wrap_content"android:layout_height="wrap_content"android:textSize="24sp"android:text="@{String.valueOf(countViewModel.count)}" /><Buttonandroid:id="@+id/incrementButton"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="增加"android:onClick="@{() -> countViewModel.increment()}" /><Buttonandroid:id="@+id/decrementButton"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="减少"android:onClick="@{() -> countViewModel.decrement()}" /></LinearLayout>
</layout>

4. Activity(视图)

MainActivity设置数据绑定,并将CountViewModel与布局绑定:

public class MainActivity extends AppCompatActivity {private CountViewModel countViewModel;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);// 使用 DataBindingUtil 设置内容视图ActivityMainBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_main);// 初始化 ViewModelcountViewModel = new ViewModelProvider(this).get(CountViewModel.class);// 将 ViewModel 绑定到布局binding.setCountViewModel(countViewModel);binding.setLifecycleOwner(this);}
}

5. ViewModel

CountViewModel类负责管理与计数器相关的数据,并将这些数据通过LiveData暴露给视图:

public class CountViewModel extends ViewModel {private CountModel countModel;private MutableLiveData<Integer> count;public CountViewModel() {countModel = new CountModel(0);count = new MutableLiveData<>(countModel.getCount());}public LiveData<Integer> getCount() {return count;}public void increment() {countModel.increment();count.setValue(countModel.getCount());}public void decrement() {countModel.decrement();count.setValue(countModel.getCount());}
}

总结

这个示例展示了如何通过MVVM架构和数据绑定简化Android开发。在这个实现中:

  • ModelCountModel)处理实际的计数逻辑。
  • ViewModelCountViewModel)将CountModel中的数据转换为LiveData并提供业务逻辑。
  • View(XML布局)使用数据绑定直接绑定数据和操作到UI组件。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/75404.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

2025 年最佳的 Retool 开源替代方案

汇总一周产品更新日志,最新发布可以前往我们的博客查看。 NocoBase 目前更新包括两个分支:main 和 next 。 main :截止目前最稳定的版本,推荐安装此版本。 next:内测版,包含一些未发布的新特性,这个版本可能还不完全稳定,适用于开发者或测试人员,用于提前体验新功能或…

平面图形中建系 | 平面直角坐标系

在平面图形中借助建立的平面直角坐标系,通过计算解决问题前情概要 如果没有笛卡尔平面直角坐标系,那么涉及平面向量的问题只能用基向量的方法[形的角度]求解,不能用代数方法[数的角度]计算;同理如果没有空间直角坐标系的介入,立体几何中的问题也就只能从形的角度思考,而不…

国家电网某全资集团公司上线智和信通一体化监控平台

根据集团的网络现状和使用场景,智和信通采取为其采取内外网分别部署的方案,对完全隔离的两张网内的设备进行管理,在保障网络安全的前提下实现集团对IT设备的纳管需求。 国网某控股集团公司是国家电网公司全资子公司和金融资产投资管理平台。集团持有财务公司、财险、…

该文件没有与之关联的应用来执行该操作。请安装应用,若已经安装应用,请在“默认应用设置“页面中创建关联

该文件没有与之关联的应用来执行该操作。请安装应用,若已经安装应用,请在“默认应用设置“页面中创建关联目录该文件没有与之关联的应用来执行该操作。请安装应用,若已经安装应用,请在“默认应用设置“页面中创建关联1. 点击左下角开始图标然后点击设置2. 点击应用3. 点击左…

AOT漫谈专题(第七篇): 聊一聊给C#打造的节点依赖图

一:背景 1. 讲故事 上一篇我们聊过AOT编程中可能会遇到的三大件问题,而这三大件问题又是考验你对AOT中节点图的理解,它是一切的原点,接下来我就画几张图以个人的角度来解读下吧,不一定对。 二:理解节点依赖图 1. 对节点的理解 按照官方的说法,构建依赖节点和GC的标记算法…

ton 通过queryId关联交易

js发起交易代码: async function sendTransaction(item, queryId) {// return false;// console.log(sendTransaction, item, address);const {beginCell,toNano,Address,TonClient,StateInit,storeStateInit,JettonMaster,Cell,} = await import("@ton/ton");const…

MD文档转幻灯片软件:Deckset MacOS电脑版Markdown文档无缝转换为演示文稿

Deckset是一款基于Mac平台的幻灯片制作软件,它允许用户将Markdown文档无缝转换为精美的演示文稿。软件内置多种主题和模板,支持自定义样式,能够满足学术或商务会议等多种需求。Deckset界面简洁直观,操作简便,支持Markdown和LaTeX语法,并提供自动布局、实时预览、演讲者笔…

火山引擎数据飞轮线上研讨会即将开启,助力消费品牌双十一造爆款

随着双十一的临近,各大品牌方的备战工作已进入紧张而有序的倒计时阶段。随着双十一的临近,各大品牌方的备战工作已进入紧张而有序的倒计时阶段。这场持续十多年的电商大促,对消费者来说是购物狂欢节,对各大品牌方来说,则是更是品牌实力与策略的比拼。面对日益激烈的市场竞…