网易首页 > 网易号 > 正文 申请入驻

LiveData Coroutine Builder的5个诡计

0
分享至

点击上方蓝字关注我,知识会给你力量

这个系列我做了协程和Flow开发者的一系列文章的翻译,旨在了解当前协程、Flow、LiveData这样设计的原因,从设计者的角度,发现他们的问题,以及如何解决这些问题,pls enjoy it。

LiveData是由Google引入的,作为连接视图(Activity/Fragment)和其ViewModel的一种手段。它就像一个简化的反应式组件(例如RxJava或Kotlin的Flow),也知道视图的生命周期。

随着最近Kotlin的Coroutine和Kotlin的Flow的推出,现在Google推出了一种使用LiveData Coroutine Builder连接Kotlin的Flow和LiveData的方法。

Benefits of using Kotlin’s Coroutine/Flow

使用Kotlin的Coroutine/Flow连接到LiveData的好处是,它可以确保底层组件(如存储库、域层)完全在后台完成。

这将有助于克服以下问题:

  • 如果主线程很忙,LiveData的postValue就会丢弃。

  • LiveData的转换功能都是在主线程中完成的。

Pre-requisite

要使用LiveData Coroutine Builder,首先我们需要包含KTX库,例如:

implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.4.0"

然后,人们可以使用它,使用:

liveData {
emit(data) // OR
emitSource(liveData)
// OR
stateFlow.asLiveData()

让我们来看看LiveData Coroutine Builder的用法吧。

1. Connect Kotlin Coroutine to LiveData

如果我们有一个需要调用的coroutine,以获取一些数据到LiveData,我们可以做以下工作。

val someTypeLiveData: LiveData = liveData {
// get data from is a suspend function
val data = aSuspedFunction()
emit(data)
img

一旦LiveData连接到任何观察者,它就会调用并接纳来自suspend函数的数据。

我们也可以确保它是在后台线程上完成的,使用:

val someTypeLiveData: LiveData =
liveData(viewModelScope.coroutineContext + Dispatchers.IO) {
// get data from is a suspend function
val data = aSuspedFunction()
emit(data)
2. Connect Kotlin Flow (or StateFlow) to LiveData

以上是一次性的获取。但如果我们有一个流程,其中数据是连续排放的,我们可以使用:

val someTypeLiveData: LiveData =
stateFlow.asLiveData(
viewModelScope.coroutineContext + Dispatchers.IO
img

一旦LiveData连接到任何观察者,它就会在stateFlow上待命,发出它的数据。在内部对于asLiveData实际上也是一个LiveData {...}。

public fun Flow.asLiveData(
context: CoroutineContext = EmptyCoroutineContext,
timeoutInMs: Long = DEFAULT_TIMEOUT
): LiveData = liveData(context, timeoutInMs) {
collect {
emit(it)

3. Transformation on Background

正如我们之前所分享的,LiveData转换是在主线程上完成的。这使得如果转换逻辑是计算密集型的,这种转换就成了问题。

为了把它移到后台,我们必须使用LiveData的switchMap和liveData的coroutine builder,如下图所示。

val liveData: LiveData =
Transformations.switchMap(sourceliveData) {
liveData(viewModelScope.coroutineContext + Dispatchers.IO)
val data = someTranformFunction(it)
emit(data)

img 4. Connecting Multiple LiveData Source Emission

在这种情况下,我们有多个LiveDatas源数据,我们想控制数据输出的逻辑,我们也可以使用Coroutine Builder。

下面是一个非常蹩脚的例子:

liveData(viewModelScope.coroutineContext + Dispatchers.IO) {
emitSource(repository.liveDataSourceA)
delay(2000)
emitSource(repository.liveDataSourceB)
delay(2000)
emitSource(repository.liveDataSourceC)

完整示例:https://github.com/elye/demo_android_compose_state_flow_livedata_viewmodel

5. Delay and Keep Coroutine Alive Temporarily

我们在liveData coroutine builder中的一个特殊功能是,它可以被配置为在LiveData不活动的特定时间内保持coroutine的活力。

这在用户改变配置或临时暂停Activity的情况下是非常有用的,而我们希望保持循环程序的活力以完成工作。但是,如果它超过了时间阈值,那么我们就想重新启动整个coroutine操作。

下面是对该条件的准确描述:

❝ liveData构建块作为coroutines和LiveData之间的结构化并发原件。该代码块在LiveData变得活跃时开始执行,当LiveData变得不活跃时,在一个可配置的超时后自动取消。如果它在完成之前被取消,那么如果LiveData再次变得活跃,它将被重新启动。如果它在之前的运行中成功完成,它不会重新启动。注意,只有在自动取消的情况下才会重新启动。如果该块因任何其他原因被取消(例如抛出一个CancellationException),它不会被重新启动。 ❞

如果我们看一下代码,我们会看到我们有timeoutInMs,它默认为5s。

@OptIn(ExperimentalTypeInference::class)
public fun liveData(
context: CoroutineContext = EmptyCoroutineContext,
timeoutInMs: Long = DEFAULT_TIMEOUT,
@BuilderInference block: suspend LiveDataScope.() -> Unit
): LiveData = CoroutineLiveData(context, timeoutInMs, block)

这意味着,当我们把活动(观察LiveData)放在后台,并且活动在暂停/停止时(注意:不是不保留活动),Coroutine将在timeoutInMs的时间内保持活力。

  • 如果超时在coroutine运行结束前完成,coroutine将在Activity恢复活动时重新启动。

img
  • 如果超时没有完成,当Activity恢复活动时,考虑到coroutine没有完成,它将继续进行直到完成。

img
  • 如果coroutine在超时前完成,即使Activity还没有恢复,coroutine也不会被重新启动,而只是发出它的最后一个值。

img TL; DR

有了LiveData coroutine builder,如果我们想的话,就不能在Kotlin Flow和LiveData之间建立桥梁。这为我们将两种技术结合在一起提供了更大的灵活性,即LiveData观察Android生命周期的能力,以及Kotlin Flor更好的反应式操作和线程处理。

https://medium.com/mobile-app-development-publication/5-uses-of-ktx-livedata-coroutine-builder-48b226bdd591

向大家推荐下我的网站 https://xuyisheng.top/ 点击原文一键直达

专注 Android-Kotlin-Flutter 欢迎大家访问

本文原创公众号:群英传,授权转载请联系微信(Tomcat_xu),授权后,请在原创发表24小时后转载。

< END >

作者:徐宜生

更文不易,点个“三连”支持一下

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
诡异的一幕:中产又可以开滴滴了,中国人排队出国……

诡异的一幕:中产又可以开滴滴了,中国人排队出国……

智谷趋势
2024-06-16 15:50:48
瑞士峰会传来消息,好家伙,幸亏中国没去参加,普京早就布好局了

瑞士峰会传来消息,好家伙,幸亏中国没去参加,普京早就布好局了

千里持剑
2024-06-15 12:53:07
一家三口因没系安全带遭交警殴打,71岁老人肋骨被打断,官方回应

一家三口因没系安全带遭交警殴打,71岁老人肋骨被打断,官方回应

洛洛女巫
2024-06-16 11:41:32
以色列遭电磁脉冲攻击,各国网友评论亮了!韩国网友评论依然在线

以色列遭电磁脉冲攻击,各国网友评论亮了!韩国网友评论依然在线

战域笔墨
2024-06-16 17:25:53
打虎不停歇:今年已有唐一军、唐仁健、苟仲文、吴英杰4名正部级被查

打虎不停歇:今年已有唐一军、唐仁健、苟仲文、吴英杰4名正部级被查

澎湃新闻
2024-06-16 15:26:26
再次爆料!美国媒体:3名中国游泳选手呈阳性,2人是东京奥运冠军

再次爆料!美国媒体:3名中国游泳选手呈阳性,2人是东京奥运冠军

体坛知识分子
2024-06-16 06:20:02
高温下的印度光伏,是教科书一般的“我之蜜糖,彼之砒霜”!

高温下的印度光伏,是教科书一般的“我之蜜糖,彼之砒霜”!

醉井观商
2024-06-16 17:44:55
惨不忍睹!广东车祸现场惊现500吨吊车吊臂砸中小车,二人丧生。

惨不忍睹!广东车祸现场惊现500吨吊车吊臂砸中小车,二人丧生。

小毅讲历史
2024-06-16 19:01:50
姜萍妈妈发与女儿合照,父亲做保洁一个月900元,姐姐打工赚学费

姜萍妈妈发与女儿合照,父亲做保洁一个月900元,姐姐打工赚学费

华庭讲美食
2024-06-16 10:58:39
冒充职业球员?欧洲杯惊现200多斤大胖子 当年差点加盟中超

冒充职业球员?欧洲杯惊现200多斤大胖子 当年差点加盟中超

球事百科吖
2024-06-16 00:04:33
视频疯传!外媒:G7峰会上意总理向马克龙投去“死亡凝视”,两人“争执”曝光

视频疯传!外媒:G7峰会上意总理向马克龙投去“死亡凝视”,两人“争执”曝光

环球网资讯
2024-06-16 13:41:16
明晚开播!60集武侠大剧来袭,看清演员阵容,终于可以熬夜追剧了

明晚开播!60集武侠大剧来袭,看清演员阵容,终于可以熬夜追剧了

猪猪侃娱乐
2024-06-16 14:50:19
就在各大高校扭扭捏捏,酝酿怎么收姜萍时,哈佛已经下手了....

就在各大高校扭扭捏捏,酝酿怎么收姜萍时,哈佛已经下手了....

看界馆
2024-06-16 12:34:34
被俄罗斯企业骗了?浙江国企买的铜没到,1.1亿元货款也没了?

被俄罗斯企业骗了?浙江国企买的铜没到,1.1亿元货款也没了?

王五说说看
2024-06-16 15:12:41
马英九悄然无声将“台湾省”三字抹掉

马英九悄然无声将“台湾省”三字抹掉

雪中风车
2024-06-16 16:55:00
利空来袭!A股明天惨了?大盘3000点不保?

利空来袭!A股明天惨了?大盘3000点不保?

风风顺顺
2024-06-16 17:32:40
瑞士和平峰会开幕:世界格局已定,剔出个体请系好安全带努力活着

瑞士和平峰会开幕:世界格局已定,剔出个体请系好安全带努力活着

大风文字
2024-06-16 16:55:10
女性私处的“芳草”,竟然是越“浓密”越“渴望”?

女性私处的“芳草”,竟然是越“浓密”越“渴望”?

水白头
2024-06-16 00:06:07
姜萍圆梦大学不止职教高考,江苏教育主管部门回应

姜萍圆梦大学不止职教高考,江苏教育主管部门回应

齐鲁壹点
2024-06-16 14:58:15
首次!大批俄军被包围,“正处于投降的边缘”

首次!大批俄军被包围,“正处于投降的边缘”

近距离
2024-06-16 13:12:55
2024-06-16 20:54:44
Android群英传
Android群英传
Android群英传
440文章数 921关注度
往期回顾 全部

科技要闻

iPhone 16会杀死大模型APP吗?

头条要闻

G7峰会上特鲁多口误:将努力确保乌克兰承担责任

头条要闻

G7峰会上特鲁多口误:将努力确保乌克兰承担责任

体育要闻

没人永远年轻 但青春如此无敌还是离谱了些

娱乐要闻

上影节红毯:倪妮好松弛,娜扎吸睛

财经要闻

打断妻子多根肋骨 上市公司创始人被公诉

汽车要闻

售17.68万-21.68万元 极狐阿尔法S5正式上市

态度原创

时尚
游戏
艺术
手机
军事航空

伊姐周日热推:电影《沙漏》;动漫《眷思量2》......

IGN分享《AC影》弥助头盔推文 网友:他不是武士

艺术要闻

穿越时空的艺术:《马可·波罗》AI沉浸影片探索人类文明

手机要闻

iOS18来了,苹果的新一轮降价也来了!赶紧上车!

军事要闻

以军宣布在加沙南部实行"战术暂停"

无障碍浏览 进入关怀版