Android kotlin MVVM 架构简单示例入门

简介: Android kotlin MVVM 架构简单示例入门

本系列学习教程笔记属于详细讲解Kotlin语法的教程,需要快速学习Kotlin语法的小伙伴可以查看“简洁” 系列的教程

快速入门请阅读如下简洁教程:
Kotlin学习教程(一)
Kotlin学习教程(二)
Kotlin学习教程(三)
Kotlin学习教程(四)
Kotlin学习教程(五)
Kotlin学习教程(六)
Kotlin学习教程(七)
Kotlin学习教程(八)
Kotlin学习教程(九)
Kotlin学习教程(十)

介绍
本次改造的项目地址为:github.com/stevenwsg/XSYBBS

这个项目是两年前在学校写的,当初写的时候比较赶时间,一直堆业务功能,没有考虑项目结构,写了很多重复代码。最近在看Kotlin协程和JetPack组件,就想着用Kotlin协程和JetPack组件对原项目进行重构。

MVVM
Android MVVM 架构图:

image.png

各层介绍:

  • Model层,主要负责数据的提供。Model层提供业务逻辑的数据结构(比如,实体类),提供数据的获取(比如,从本地数据库或者远程网络获取数据),提供数据的存储。
  • View层,主要负责界面的显示。View层不涉及任何的业务逻辑处理,它持有ViewModel层的引用,当需要进行业务逻辑处理时通知ViewModel层。
  • ViewModel层,主要负责业务逻辑的处理。ViewModel层不涉及任何的视图操作。ViewModel层中数据的变化可以自动通知View层进行更新,因此ViewModel层不需要持有View层的引用。

Google JetPack搭建MVVM:

image.png
本次MVVM改造使用了JetPack的三个组件分别是:

  • Lifecycles
  • ViewModel
  • LiveData

Lifecycles

作用:更方便的处理Android中生命周期的问题,它可以使你的组件具有感知生命周期的能力,从而根据生命周期状态来自动的响应一些动作。

使用文档:https://developer.android.com/topic/libraries/architecture/lifecycle

ViewModel

作用: 用来管理数据,它同样具有感知生命周期的能力,在宿主没有被销毁之前,数据不会丢失,且ViewModel不会重新创建,比如旋转屏幕等。同时,ViewMedel将数据从Activity中抽离出去,耦合度更低,更加方便维护。

使用文档:https://developer.android.com/topic/libraries/architecture/viewmodel

LiveData

配合ViewModel一起使用,存在于ViewModel中

LiveData 是一个可观测数据的容器类,与普通的可观测类不同,LiveData 能感知生命周期,并且只会在这些可观测的应用组件处于活动状态的时候才会更新它们,而且还会在与其关联的生命周期被销毁后自动清理自己。这样一来也就不会出现内存泄漏的问题了。

作用:底层数据改变时会自动更新UI,实际上我们可以看做是ViewModel于View之间通信的桥梁

使用文档:https://developer.android.com/topic/libraries/architecture/livedata

改造用户反馈模块
在项目中添加 lifecycle-extensions 和 Kotlin 依赖

    implementation 'androidx.lifecycle:lifecycle-extensions:2.2.0'
    implementation "androidx.core:core-ktx:1.2.0"
    implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.2.0"
    implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"

下面是项目的结构:

image.png

  • bean 反馈实体和请求返回实体

  • model 存放业务逻辑相关

  • view 存放Activity

  • viewmodel 存放viewmodel相关类

在MVVM中,通过LiveData来实现ViewModel与View层之间的通信的,而且这个通信不是手动的,其核心是通过数据驱动的,也就是数据发生变化,view层会感知到并自动刷新ui。

1、View
View 持有ViewModel 的引用,当需要和Model进行通信时,通过ViewModel来进行通信。同时监听ViewModel中的数据变化,当ViewModel中的数据改变时,刷新UI,实现数据驱动。

class FeedBackActivity : BaseActivity() {
   

    private var mFeedBackVM : FeedBackViewModel? = null // 持有ViewModel的引用

    override fun onCreate(savedInstanceState: Bundle?) {
   
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_feedback)
        initView()
        initVM()
        initObserval()
    }

    private fun initView() {
   
        bt_back.setOnClickListener {
   
            if (!TextUtils.isEmpty(et_back.text.toString())) {
   
                mFeedBackVM?.getFeedBackMessage(et_back.text.toString()) // 调用ViewModel 的反馈方法, 解耦,单一职责
            } else {
   
                Toasty.info(this@FeedBackActivity,  getString(R.string.text_tost_empty), Toast.LENGTH_SHORT, true).show()
            }

        }
    }

    private fun initVM() {
    // 初始化ViewModel
        mFeedBackVM = ViewModelProvider(this).get(FeedBackViewModel::class.java)
    }

    private fun initObserval() {
    // 观测数据,当ViewModel的LiveData数据改变时,更新UI
        mFeedBackVM?.messageLiveData?.observe(this, Observer {
    t ->
            if (t?.code == 0) {
   
                Toasty.success(this@FeedBackActivity, t.message, Toast.LENGTH_SHORT, true).show()
                finish()
            } else {
   
                t?.message?.let {
    Toasty.error(this@FeedBackActivity, it, Toast.LENGTH_SHORT, true).show() }
            }
        })
    }
}

2、ViewModel

ViewModel 使用ViewModelScope协程来发起网络请求,将结果使用LiveData 发送到上层。

class FeedBackViewModel : ViewModel() {
   

    var messageLiveData = MutableLiveData<FeedBackResultMessage>()
    private var feedBackResultMessage: FeedBackResultMessage? = null

    fun getFeedBackMessage(content: String) {
   
        viewModelScope.launch(Dispatchers.IO) {
   
            val feedBack = Feedback(content)
            feedBack.save(object : SaveListener<String>() {
   
                override fun done(p0: String?, p1: BmobException?) {
   
                    feedBackResultMessage = if (p1 == null) {
   
                        FeedBackResultMessage(
                            FeedBackResultMessage.CODE_SUCCESS,
                            FeedBackResultMessage.MESSAGE_SUCCESS
                        )
                    } else {
   
                        FeedBackResultMessage(
                            FeedBackResultMessage.CODE_ERROR,
                            FeedBackResultMessage.MESSAGE_ERROR
                        )
                    }
                    messageLiveData.postValue(feedBackResultMessage)
                }
            })
        }
    }
}

3、Bean
反馈实体

data class Feedback (var Content : String,
                    var deviceType : String = "android",
                    var userid : String = BmobUser.getCurrentUser(User::class.java).objectId) : BmobObject() //以前项目中使用了Bmob的数据库存储服务

反馈结果实体

/*
 * code 0 代表成功
 * code 1 代表失败
 */
data class FeedBackResultMessage (val code : Int, val message: String) {
   

    companion object {
   
        const val CODE_SUCCESS : Int = 0
        const val CODE_ERROR : Int = 1

        const val MESSAGE_SUCCESS : String = "反馈成功~~~"
        const val MESSAGE_ERROR : String = "反馈失败~~~,请检查网络"
    }
}

总结

MVVM优点:

  • 降低耦合度

  • 数据驱动

  • 可以异步线程更新数据

  • 易于单元测试

  • 方便协同开发等

目前已经使用这种改造方法改造了反馈模块,修改密码模块,发帖模块。后续的话逐渐把整个项目使用MMVM进行改造。

目录
相关文章
|
14天前
|
前端开发 测试技术 数据处理
Kotlin教程笔记 - MVP与MVVM架构设计的对比
Kotlin教程笔记 - MVP与MVVM架构设计的对比
35 4
|
25天前
|
XML 前端开发 Android开发
Kotlin教程笔记(80) - MVVM架构设计
Kotlin教程笔记(80) - MVVM架构设计
|
28天前
|
前端开发 JavaScript 测试技术
android做中大型项目完美的架构模式是什么?是MVVM吗?如果不是,是什么?
在 Android 开发中,选择合适的架构模式对于构建中大型项目至关重要。常见的架构模式有 MVVM、MVP、MVI、Clean Architecture 和 Flux/Redux。每种模式都有其优缺点和适用场景,例如 MVVM 适用于复杂 UI 状态和频繁更新,而 Clean Architecture 适合大型项目和多平台开发。选择合适的架构应考虑项目需求、团队熟悉度和可维护性。
49 6
|
8天前
|
XML 前端开发 Android开发
Kotlin教程笔记(80) - MVVM架构设计
Kotlin教程笔记(80) - MVVM架构设计
|
1月前
|
存储 Dart 前端开发
flutter鸿蒙版本mvvm架构思想原理
在Flutter中实现MVVM架构,旨在将UI与业务逻辑分离,提升代码可维护性和可读性。本文介绍了MVVM的整体架构,包括Model、View和ViewModel的职责,以及各文件的详细实现。通过`main.dart`、`CounterViewModel.dart`、`MyHomePage.dart`和`Model.dart`的具体代码,展示了如何使用Provider进行状态管理,实现数据绑定和响应式设计。MVVM架构的分离关注点、数据绑定和可维护性特点,使得开发更加高效和整洁。
155 3
|
28天前
|
前端开发 Java 测试技术
android MVP契约类架构模式与MVVM架构模式,哪种架构模式更好?
android MVP契约类架构模式与MVVM架构模式,哪种架构模式更好?
41 0
|
20天前
|
缓存 负载均衡 JavaScript
探索微服务架构下的API网关模式
【10月更文挑战第37天】在微服务架构的海洋中,API网关犹如一座灯塔,指引着服务的航向。它不仅是客户端请求的集散地,更是后端微服务的守门人。本文将深入探讨API网关的设计哲学、核心功能以及它在微服务生态中扮演的角色,同时通过实际代码示例,揭示如何实现一个高效、可靠的API网关。
|
18天前
|
Cloud Native 安全 数据安全/隐私保护
云原生架构下的微服务治理与挑战####
随着云计算技术的飞速发展,云原生架构以其高效、灵活、可扩展的特性成为现代企业IT架构的首选。本文聚焦于云原生环境下的微服务治理问题,探讨其在促进业务敏捷性的同时所面临的挑战及应对策略。通过分析微服务拆分、服务间通信、故障隔离与恢复等关键环节,本文旨在为读者提供一个关于如何在云原生环境中有效实施微服务治理的全面视角,助力企业在数字化转型的道路上稳健前行。 ####
|
19天前
|
Dubbo Java 应用服务中间件
服务架构的演进:从单体到微服务的探索之旅
随着企业业务的不断拓展和复杂度的提升,对软件系统架构的要求也日益严苛。传统的架构模式在应对现代业务场景时逐渐暴露出诸多局限性,于是服务架构开启了持续演变之路。从单体架构的简易便捷,到分布式架构的模块化解耦,再到微服务架构的精细化管理,企业对技术的选择变得至关重要,尤其是 Spring Cloud 和 Dubbo 等微服务技术的对比和应用,直接影响着项目的成败。 本篇文章会从服务架构的演进开始分析,探索从单体项目到微服务项目的演变过程。然后也会对目前常见的微服务技术进行对比,找到目前市面上所常用的技术给大家进行讲解。
38 1
服务架构的演进:从单体到微服务的探索之旅
|
1天前
|
弹性计算 API 持续交付
后端服务架构的微服务化转型
本文旨在探讨后端服务从单体架构向微服务架构转型的过程,分析微服务架构的优势和面临的挑战。文章首先介绍单体架构的局限性,然后详细阐述微服务架构的核心概念及其在现代软件开发中的应用。通过对比两种架构,指出微服务化转型的必要性和实施策略。最后,讨论了微服务架构实施过程中可能遇到的问题及解决方案。