真香!Kotlin+MVVM+LiveData+协程 打造 Wanandroid!

2024-02-17 21:32

本文主要是介绍真香!Kotlin+MVVM+LiveData+协程 打造 Wanandroid!,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

关注 秉心说,公众号后台回复 玩安卓 即可获取 Wanandroid 安装包。

Wanandroid 是鸿洋鸿大大的安卓开源知识网站,包含最新博文,最新项目,常用工具,公众号文章收录等等功能,同时也开源了所有 API 接口,方便大家打造自己的 Wanandroid 客户端。Github 上关于 Wanandroid 的客户端也层出不穷,Java的,Kotlin 的,Flutter 的,Mvp 的,MVMM 的,各种各样,但是还没看到 Kotlin+MVVM+LiveData+协程 版本的,加上最近正在看 MVVM 和 LiveData,就着手把我之前写的 Mvp 版本的 Wanandroid 改造成 MVVM,项目地址 。注意,mater 分支是年久失修的 Mvp 版本,不一定保证可以运行。mvvm-kotlin 分支是最新代码。

关于 MVVM,大家应该也比较熟悉了,上一张 MVVM 经典架构图:

Model-View-ViewModelView 指绿色的 Activity/Fragment,主要负责界面显示,不负责任何业务逻辑和数据处理。Model 指的是 Repository 包含的部分,主要负责数据获取,来组本地数据库或者远程服务器。ViewModel 指的是图中蓝色部分,主要负责业务逻辑和数据处理,本身不持有 View 层引用,通过 LiveDataView 层发送数据。Repository 统一了数据入口,不管来自数据库,还是服务器,统一打包给 ViewModel ,我在项目中并没有使用数据库,而是使用缓存代替。

除了 MMVM 以外,我用 协程 代替了 RxJava。这里先不论协程和 RxJava 孰优孰劣,只是用惯了 RxJava,协程的确会给你耳目一新的感觉,用同步的方式写异步代码。在 Java 中并没有协程的概念,Kotlin 中在编译期实现了协程,通过类似状态机的实现。协程可以看做是轻量级的线程,不会存在上下文切换的带来的性能损耗,理论上是比线程效率更高的。

下面以登录页面 LoginActivity 为例,看一下数据流程。

Model

@POST("/user/login")
fun login(@Field("username") userName: String, @Field("password") passWord: String): Deferred<WanResponse<User>>

这是登录 Api 接口。

class LoginRepository : BaseRepository() {suspend fun login(userName: String, passWord: String): WanResponse<User> {return apiCall { WanRetrofitClient.service.login(userName, passWord).await() }}}

LoginRepository 中定义具体的登录逻辑,通过 Retrofit 调用登录接口,返回 WanResponse<User>。注意,要在协程中使用,所以定义为 suspend 方法。

ViewModel

class LoginViewModel : BaseViewModel() {val mLoginUser: MutableLiveData<User> = MutableLiveData()val errMsg: MutableLiveData<String> = MutableLiveData()private val repository by lazy { LoginRepository() }fun login(userName: String, passWord: String) {launch {val response = withContext(Dispatchers.IO) { repository.login(userName, passWord) }executeResponse(response, { mLoginUser.value = response.data }, { errMsg.value = response.errorMsg })}}
}

LoginViewModel 持有 LoginRepository,并通过它执行具体登录逻辑,这一块使用协程执行。返回结果通过 executeResponse() 方法处理,这是我自己封装的方法:

suspend fun executeResponse(response: WanResponse<Any>, successBlock: suspend CoroutineScope.() -> Unit,errorBlock: suspend CoroutineScope.() -> Unit) {coroutineScope {if (response.errorCode == -1) errorBlock()else successBlock()}}

Kotlin 的一些函数式编程语言特性会给我们的开发带来一些便利。executeResponse() 提供了统一的响应错误处理。

View

 mViewModel.apply {mLoginUser.observe(this@LoginActivity, Observer {dismissProgressDialog()startActivity(MainNormalActivity::class.java)finish()})errMsg.observe(this@LoginActivity, Observer {dismissProgressDialog()it?.run { toast(it) }})}

最后就是 LoginActivity 代表的 View 层了,View 层和 ViewModel 层通过 LiveData 进行绑定,上面代码中的 mLoginUsererrMsg 就是 ViewModel 层 “发射” 过来的数据。关于数据绑定,我并没有使用 DataBinding,这个纯粹是个人喜好了,我只是不喜欢 DataBinding 带来的代码不易读。

相对 Mvp 繁多的接口来说,个人感觉 Mvvm 的数据流更加清晰。搭配 Kotlin 和协程的使用,进一步简化代码。下面是一些项目截图:

项目地址点这个: 传送门,记得切换到 mvvm-kotlin 分支 ,欢迎带来 star 和 issue 丢过来 !

推荐一下我的另一个应用,Box —— 我的开发助手,添加了查看 logcat 的功能。

最后,也欢迎大家关注我的公众号 秉心说,话说公号关注人数还没掘金多,后续会继续 《走进 JDK 系列》以及 Android 相关知识的分享,欢迎大家扫码关注!有任何关于 Java/Android 的问题也可以加我的个人微信 bingxinshuo_

公众号后台回复 玩安卓 即可获取 Wanandroid 安装包。

文章首发微信公众号: 秉心说 , 专注 Java 、 Android 原创知识分享,LeetCode 题解,欢迎关注!

这篇关于真香!Kotlin+MVVM+LiveData+协程 打造 Wanandroid!的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/719044

相关文章

Kotlin 作用域函数apply、let、run、with、also使用指南

《Kotlin作用域函数apply、let、run、with、also使用指南》在Kotlin开发中,作用域函数(ScopeFunctions)是一组能让代码更简洁、更函数式的高阶函数,本文将... 目录一、引言:为什么需要作用域函数?二、作用域函China编程数详解1. apply:对象配置的 “流式构建器”最

Android Kotlin 高阶函数详解及其在协程中的应用小结

《AndroidKotlin高阶函数详解及其在协程中的应用小结》高阶函数是Kotlin中的一个重要特性,它能够将函数作为一等公民(First-ClassCitizen),使得代码更加简洁、灵活和可... 目录1. 引言2. 什么是高阶函数?3. 高阶函数的基础用法3.1 传递函数作为参数3.2 Lambda

kotlin的函数forEach示例详解

《kotlin的函数forEach示例详解》在Kotlin中,forEach是一个高阶函数,用于遍历集合中的每个元素并对其执行指定的操作,它的核心特点是简洁、函数式,适用于需要遍历集合且无需返回值的场... 目录一、基本用法1️⃣ 遍历集合2️⃣ 遍历数组3️⃣ 遍历 Map二、与 for 循环的区别三、高

kotlin中的数据转换方法(示例详解)

《kotlin中的数据转换方法(示例详解)》这篇文章介绍了Kotlin中将数字转换为字符串和字符串转换为数字的多种方法,包括使用`toString()`、字符串模板、格式化字符串、处理可空类型等,同时... 目录1. 直接使用 toString() 方法2. 字符串模板(自动转换)3. 格式化字符串(控制输

kotlin中的行为组件及高级用法

《kotlin中的行为组件及高级用法》Jetpack中的四大行为组件:WorkManager、DataBinding、Coroutines和Lifecycle,分别解决了后台任务调度、数据驱动UI、异... 目录WorkManager工作原理最佳实践Data Binding工作原理进阶技巧Coroutine

kotlin中的模块化结构组件及工作原理

《kotlin中的模块化结构组件及工作原理》本文介绍了Kotlin中模块化结构组件,包括ViewModel、LiveData、Room和Navigation的工作原理和基础使用,本文通过实例代码给大家... 目录ViewModel 工作原理LiveData 工作原理Room 工作原理Navigation 工

Spring AI与DeepSeek实战一之快速打造智能对话应用

《SpringAI与DeepSeek实战一之快速打造智能对话应用》本文详细介绍了如何通过SpringAI框架集成DeepSeek大模型,实现普通对话和流式对话功能,步骤包括申请API-KEY、项目搭... 目录一、概述二、申请DeepSeek的API-KEY三、项目搭建3.1. 开发环境要求3.2. mav

Android kotlin语言实现删除文件的解决方案

《Androidkotlin语言实现删除文件的解决方案》:本文主要介绍Androidkotlin语言实现删除文件的解决方案,在项目开发过程中,尤其是需要跨平台协作的项目,那么删除用户指定的文件的... 目录一、前言二、适用环境三、模板内容1.权限申请2.Activity中的模板一、前言在项目开发过程中,尤

用Java打造简易计算器的实现步骤

《用Java打造简易计算器的实现步骤》:本文主要介绍如何设计和实现一个简单的Java命令行计算器程序,该程序能够执行基本的数学运算(加、减、乘、除),文中通过代码介绍的非常详细,需要的朋友可以参考... 目录目标:一、项目概述与功能规划二、代码实现步骤三、测试与优化四、总结与收获总结目标:简单计算器,设计

基于 YOLOv5 的积水检测系统:打造高效智能的智慧城市应用

在城市发展中,积水问题日益严重,特别是在大雨过后,积水往往会影响交通甚至威胁人们的安全。通过现代计算机视觉技术,我们能够智能化地检测和识别积水区域,减少潜在危险。本文将介绍如何使用 YOLOv5 和 PyQt5 搭建一个积水检测系统,结合深度学习和直观的图形界面,为用户提供高效的解决方案。 源码地址: PyQt5+YoloV5 实现积水检测系统 预览: 项目背景