【易客吧】_全网激活码总代_激活码商城

您现在的位置是:首页 > 热门资讯 > 正文

热门资讯

Kotlin 协程和 LiveData:协力打造响应式且可测试的 Android 应用程序 (kotlin读音)

用户投稿2024-04-12热门资讯22

在 Android 应用程序开发中,Kotlin 协程和 LiveData 是两种强大的工具,可用于创建响应式且可测试的应用程序。协程允许您异步执行任务,而 LiveData 是一种可观察的数据持有者,可让您轻松处理数据更改。

协程

协程是一种轻量级线程,可让您在不阻塞主线程的情况下执行长时间运行的任务。使用协程可以避免以下情况:

  • 应用程序无响应
  • 内存泄漏
  • 难以测试代码

要使用协程,您需要使用 kotlinx.coroutines 库。以下是一些协程的基本用法:


// 创建一个协程并启动它
val job = launch {// 在此协程中执行长时间运行的任务
}// 等待协程完成
job.join()

LiveData

LiveData 是 Android Jetpack 库的一部分。它是一种可观察的数据持有者,可让您轻松处理数据更改。与协程类似,LiveData 可帮助您创建响应式且可测试的应用程序。以下是一些 LiveData 的优点:

  • 数据更改自动更新 UI
  • 易于观察和测试
  • 避免内存泄漏

要使用 LiveData,您需要使用 androidx.lifecycle 库。以下是一些 LiveData 的基本用法:


// 创建一个 LiveData 对象
val liveData = MutableLiveData()// 观察 LiveData 对象
liveData.observe(this, Observer { value ->// 当 LiveData 对象的值发生更改时执行此操作
})// 设置 LiveData 对象的值
liveData.value = "新值"

协程和 LiveData 协同工作

协程和 LiveData 可以协同工作,以创建功能更强大的应用程序。例如,您可以使用协程从网络加载数据,然后使用 LiveData 将数据更新到 UI 中。以下是如何做到这一点:

// 在协程中从网络加载数据
launch {val data = loadFromNetwork()liveData.value = data
}// 观察 LiveData 对象并在 UI 中更新数据
liveData.observe(this, Observer { value ->// 当 LiveData 对象的值发生更改时更新 UI
})

好处

使用协程和 LiveData 可以给您的应用程序带来许多好处,包括:
  • 提高响应能力
  • 减少内存泄漏
  • 提高可测试性
  • 降低开发复杂度

结论

Kotlin 协程和 LiveData 是 Android 开发人员强大的工具。通过协同使用这些工具,您可以创建响应式且可测试的应用程序,这些应用程序更易于维护和调试。如果您正在寻找方法来改善应用程序的性能和可维护性,那么我强烈建议您研究协程和 LiveData。

进一步阅读

  • Kotlin 协程文档
  • LiveData 文档
  • Kotlin 协程 Codelab
  • LiveData Codelab

MVVM框架中Kotlin Flow的实践

在 Google Android 团队宣布了 Jetpack 的视图模型之后,MVVM 架构已经成为了 Android 开发最流行的架构之一。如下图所示:

不过在 Google 的前期官方文档中,其 Repository 层是直接使用 LiveData 的,而且连 Jetpack Room 也对 LiveData 进行了支持,接口可以直接返回 LiveData 的数据。所以在很长一段时间内,各种开源的 MVVM 框架或者博客中,也是在 Repository 层中直接使用 LiveData。

这里,我们就会有疑问:Repository 层为什么使用 LiveData 呢?(因为通过官方文档介绍,LiveData 应该要跟Acvtivity 、Fragment 这类UI组件有关系,需要依赖 Lifecycle,放在 Repository 层非常奇怪)。

那么正确的做法是什么呢?下面将会展示基于 LiveData 实践的 MVVM框架、其存在的弊端、以及基于 Flow 实践的 MVVM框架,然后通过引入 Flow 来解决 LiveData 存在的问题。

首先将这张 MVVM 框架图细化,来看看每个层级间的数据类型和数据流向:

然后再进一步细化,来看下设计细节:

以下是以 请求网络数据为例:

UI 层:

ViewModel 层:

Repository 层:

LiveData API设计得过于简单,难以应对Repository层可能出现的许多复杂的数据处理场景。主要体现在以下三个方面:

在复杂的业务场景中,往往伴随着线程切换来对数据进行多次处理,类似 RxJava 的observeOn以及 Flow 的flowOn ,而 LiveData 并没有这种能力。所以只能通过 协程来进行线程切换,而在 Repository 层,就只能自定义repositoryScope并处理协程取消的逻辑。即:

LiveData 肩负着为 UI 提供数据订阅的能力,所以他的数据订阅只能在主线程,虽然可以在子线程通过 postValue 去发布数据,但短期内调用 postValue 过快,由于没有背压处理,只保留最新的数据,因此可能造成预期之外的数据丢失问题。

而 Flow 则拥有完善的背压策略,可应对 Repository 层可能出现的各种复杂数据场景。

LiveData 依赖 Lifecycle,具有生命周期感知能力,遵循 activity 和 fragment 等实体的生命周期,在非 UI 的场景中使用要么需要自定义 Lifecycle , 要么使用LiveData#observerForever (会造成泄露的风险)。在上面的案例中,ViewModel 需要监听 Repositoy 层的 LiveData,就必须特殊处理,避免内存泄露的问题。例如:

使用 Flow 来替换 Repository 层中 LiveData 使用,主要涉及到 ViewModel 层和 Repository 层基础类的修改,而修改后的逻辑更加简洁、易读。而且官方文档也有所更新,对 LiveData 的使用场景有所限制,见: /topic/libra… :

由于 API 设计一致,使用方法与之前没有任何更改,因此可以无缝切换。唯一变更点就是 Repository 层的返回数据类型由 LiveData 修改为 Flow:

综上,可以在Repository层使用Flow获取数据,并且Retrofit、Room都有自带的Flow扩展支持,使用上基本无缝衔接;ViewModel层collect来自Repository层的Flow,进行数据转换,将Model转到VO,再利用LiveData进行UI更新。

纯kotlin+ViewModel+LiveData+协程MVVM

MVVM大家都了解差不多了,但是我发现MVVM整成架构时,每个人的写法真的是千差万别。

除了MVVM必要的ViewModel、LiveData,其它写法也没有统一的标准,看下来写法特别多,jetpack、kotlin、java、databinding、rxjava、协程、操作符等等各种混用,甚至还有把mvp的presenter当vm使用的,有的项目混用的多了看起来真的很不直观,没法用到实际项目中。

那就自己写一个简单的纯净版mvvm,不用jetpack、databinding、rxjava、晦涩的操作符等。同时也练习一下kotlin各种高阶函数、扩展、新特性等。git地址

这两个项目强烈建议多学习

Android真的推荐用MVI模式?MVI和MVVM有什么区别?

android自己卷自己,自己造一个MVI架构模式吗?

MVI架构模式是国内android开发者最近一两年造出来的吗?

看了很多MVI的资料,发现都提到框架。android的mvi架构就是启发于框架。

我们再看看框架是什么时候开始的,又是什么时候开始使用MVI模式的。

框架 第一个预发版本

再结合官方文档来看,框架就是为了MVI架构模式而生的。

虽然不知道,框架是不是首个MVI模式框架。

但是从很多资料可以推测,MVI架构模式就是框架推广开来的。

而且早在2014年就已经在前端开发中用得飞起了。

想想2014年,咱们在干嘛?android在用什么架构模式。

正所谓,天下武功出少林啊。

我们android的很多技术,在前端早就用“烂了”。

我们知道MVP和MVVM的爹都是MVC。MVI的爹也是MVC。

MVC的Controller是命令是编程组件,不能直接实现响应式编程思想。

Kotlin 协程和 LiveData:协力打造响应式且可测试的 Android 应用程序 (kotlin读音) 第1张

响应式编程范式(Reactive programming):

安卓官方的compose框架、微信小程序、Flutter、React、鸿蒙UI的开发框架,都是使用响应式开发框架。

这里就不拓展开来讲了,上面提到的任何一个开发框架,你只要会一个基本就能理解响应式编程范式。

如果一个都不会也没关系,现在不理解响应式编程也没关系,等你学会MVI就理解了,这种只有实际使用过才能深刻理解。

学不会也没关系,不要焦虑(尤其那些工作不久的小伙伴,学不会属于正常现象~)

MVI,咱第一遍学不会,就等2年,再学一遍~

2年后也没学会,那就再等2年~ 一定要有耐心~

如果还是学不会,那也没关系,因为MVI早晚也会过时~ 等过时了就不用学了~

哈哈哈~ 别笑,正经Android可不会开玩笑的。

就像rxjava,当年有多少人死活学不会,android开发现在谁还学Rxjava?哈哈哈~

用一张图来总结这次升级的核心思想:

新版架构指南在旧版的基础上,做了如下调整和建议:

1. 将LiveData组件改成了StateFlow

对协程的使用更友好。并且更能体现面向数据流开发的思想。

实际上,依然使用LiveData也没毛病。

2. ViewModel传递给View的数据限制为View的UIState

ViewModel从Model层获取数据后,转换为UIState数据,通过StateFlow流向View层。

UIState的数据面向界面组件而定义的,是能直接控制View组件如何显示的数据。

所以我们也可以称UIState为界面的状态或者View的状态。

如下:

3. 单数据流还是多数据流的选择

官方指南并没有强制我们使用单流。

同一个界面应该使用单个StateFlow还是多个StateFlow,需要我们自己判断。

我们应该根据UIStates数据们之间关联程度来决定多流还是单流。

单流优缺点都十分明显:

优点: 数据集中管控,会提高代码的可读性和修改的便利性。

缺点: 当数据非常多且复杂时,会影响效率。因为我们没有diff功能,View层不能只更新有变化的数据,只会根据UIState刷新当前界面。

我们再看下官方新版架构图:

当然不仅仅MVVM可以改造成响应式开发范式,MVP也是可以的。

不信你看 这篇blog

1. 理解MVC架构模式的思想【MVC是其他架构模式之爹,他的思想是MVP、MVVM、MVI的基础,学会它是关键步骤~】。

3. 学习kotlin的StateFlow组件,的使用:Sequence->Flow->StateFlow。

4. 学习ViewModel组件的使用(虽然不用ViewModel也能实现MVI架构,但是ViewModel还是值得学习)。

5. 理解DRY(Dont Repeat Yourself)原则。

6. 理解MVVM(因为官方的MVI模式是基于MVVM的基础改造的~)。

7. 学习官方架构指南。

8. 实战。

在这里就分享一份由大佬亲自收录整理的 学习PDF+架构视频+面试文档+源码笔记 , 高级架构技术进阶脑图、Android开发面试专题资料,高级进阶架构资料

这些都是我现在闲暇时还会反复翻阅的精品资料。里面对近几年的大厂面试高频知识点都有详细的讲解。相信可以有效地帮助大家掌握知识、理解原理,帮助大家在未来取得一份不错的答卷。

当然,你也可以拿去查漏补缺,提升自身的竞争力。

真心希望可以帮助到大家,Android路漫漫,共勉!

如果你有需要的话,只需 私信我【进阶】即可获取

若对本页面资源感兴趣,请点击下方或右方图片,注册登录后

搜索本页相关的【资源名】【软件名】【功能词】或有关的关键词,即可找到您想要的资源

如有其他疑问,请咨询右下角【在线客服】,谢谢支持!

Kotlin 协程和 LiveData:协力打造响应式且可测试的 Android 应用程序 (kotlin读音) 第2张

发表评论

评论列表

  • 这篇文章还没有收到评论,赶紧来抢沙发吧~
你上次访问网站的时间为:24-05-17,16:02:08 你第25访问网站的时间为:24-05-17 16:02:13