浅谈Android开发中的MVVM模式

Posted 冬天的毛毛雨

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了浅谈Android开发中的MVVM模式相关的知识,希望对你有一定的参考价值。

作者:miaowmiaow

前言

看到有人说 MVVM 核心是 双向绑定,没有使用 Databinding 的项目都是假 MVVM 。
即:MVVM == 双向绑定,双向绑定 == Databinding,MVVM == Databinding。

今天我们便来聊一聊 android 中的 MVVM。

MVVM

MVVM(Model-View-ViewModel)最早由微软提出。ViewModel指 “Model of View”——视图的模型。

  • Model:它仅仅关注数据本身,不关心任何行为。
  • View:负责接收用户输入、发起数据请求及展示结果页面。
  • ViewModel:负责业务逻辑,实现 View 与 Model 的双向绑定。

双向绑定

简而言之,视图随数据改变,数据随视图改变。

Android 中的 MVVM

在 Android 中我们通过 Jetpack 提供的多个组件来实现 MVVM 。

  • Model:对应图中的 Repository(网络请求数据、本地数据库数据等)。
  • View:对应图中的 Activity/Fragment
  • ViewModel:对应图中的 ViewModelLiveData

ViewModel + LiveData 实现双向绑定

Activity/Fragment 通过观察 ViewModel 中的 LiveData 来更新界面。
Repository 通过更新 ViewModel 中的 LiveData 来更新界面。

单纯的文字可能比较晦涩难懂,我们结合代码来看会更加清晰。

TestActivity

import android.os.Bundle
import android.view.LayoutInflater
import androidx.activity.viewModels
import androidx.appcompat.app.AppCompatActivity
import com.example.fragment.project.databinding.ActivityTestBinding
import com.example.fragment.project.model.TestViewModel

class TestActivity : AppCompatActivity() 

    override fun onCreate(savedInstanceState: Bundle?) 
        super.onCreate(savedInstanceState)
        val bind = ActivityTestBinding.inflate(LayoutInflater.from(this))
        setContentView(bind.root)

        // 使用“by viewModels()”Kotlin属性委托获取ViewModel
        val viewModel: TestViewModel by viewModels()

        bind.btn.setOnClickListener 
            //通过LiveData更新天气信息
            viewModel.updateWeather("阴天")
        

        //通过观察LiveData来更新界面
        viewModel.weatherResult.observe(this) 
            bind.weather.text = it
        

        //通过ViewModel获取天气信息
        viewModel.getWeather()
    


activity_test.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/white">

    <TextView
        android:id="@+id/weather"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:text="雨天" />

    <Button
        android:id="@+id/btn"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@id/weather"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="20dp"
        android:text="纠正天气:阴天" />
</RelativeLayout>

TestViewModel

import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel

class TestViewModel : ViewModel() 

    // 这边就不写Model直接更新数据

    val weatherResult = MutableLiveData<String>()

    fun getWeather() 
        // 获取网络数据或本地数据库数据等
        weatherResult.postValue("晴天")
    

    fun updateWeather(str: String) 
        // 更新网络数据或本地数据库数据等
        weatherResult.postValue(str)
    


至此 Android 开发中的 MVVM 算是全部讲完。

MVVM 与 DataBinding 的关系

原本计最后详细讲下 Databinding | 数据绑定库 ,写到这里又觉得没必要。
怎么说呢,MVVM 是一种架构模式,而 DataBinding 是谷歌推出的方便实现 MVVM 的工具。
对此感兴趣的童鞋可以自行去官网查看。

Thanks

以上就是本篇文章的全部内容,如有问题欢迎指出,我们一起进步。
如果喜欢的话希望点个赞吧,您的鼓励是我前进的动力。
谢谢~~

最后推荐一个入门级的项目 fragmject ,通过对Kotlin和Jetpack全家桶的系统运用,实现的一个功能完备符合主流市场标准App。 代码简单,内容全面,知识详细,快速上手,对理解其他项目设计思想和封装技巧也很有帮助。

以上是关于浅谈Android开发中的MVVM模式的主要内容,如果未能解决你的问题,请参考以下文章

浅谈Android MVP 设计模式

iOS开发之浅谈MVVM的架构设计与团队协作

切图崽的自我修养-[MVVM] Js MV*模式浅谈

浅谈框架模式 MVCMVP 和 MVVM

浅谈 MVC 和 MVVM 模型

Android进阶之MVVM+DataBinding框架模式(更新中)