从 Android UI 收集流的更安全的方法

9 篇文章 0 订阅
6 篇文章 0 订阅

在 Android 应用程序中,通常从 UI 层收集 Kotlin 流,以在屏幕上显示数据更新。但是,您希望收集这些流,以确保您没有做不必要的工作、浪费资源(CPU 和内存)或在视图进入后台时泄漏数据。

在本文中,您将了解 Lifecycle.repeatOnLifecycle 和 Flow.flowWithLifecycle API 如何保护您免于浪费资源,以及为什么它们是 UI 层中用于流收集的良好默认设置。

浪费资源 建议从应用层次结构的较低层公开 Flow API,而不管流生产者的实现细节如何。但是,您也应该安全地收集它们。

由通道支持或使用带有缓冲区的操作符(例如 buffer、conflate、flowOn 或 shareIn)的冷流不能安全地使用某些现有 API(例如 CoroutineScope.launch、Flow.launchIn 或 LifecycleCoroutineScope.launchWhenX)来收集,除非您当活动进入后台时,手动取消启动协程的作业。这些 API 将保持底层流生产者处于活动状态,同时在后台将项目发送到缓冲区中,从而浪费资源。

注意:冷流是一种在新订阅者收集时按需执行生产者代码块的流。

// Implementation of a cold flow backed by a Channel that sends Location updates
fun FusedLocationProviderClient.locationFlow() = callbackFlow<Location> {
    val callback = object : LocationCallback() {
        override fun onLocationResult(result: LocationResult?) {
            result ?: return
            try { offer(result.lastLocation) } catch(e: Exception) {}
        }
    }
    requestLocationUpdates(createLocationRequest(), callback, Looper.getMainLooper())
        .addOnFailureListener { e ->
            close(e) // in case of exception, close the Flow
        }
    // clean up when Flow collection ends
    awaitClose {
        removeLocationUpdates(callback)
    }
}

视觉图

回到开头,直接从以lifecycleScope.launch 开始的协程收集locationFlow 是危险的,因为即使View 在后台,收集也会继续进行。

repeatOnLifecycle 可以防止您浪费资源和应用程序崩溃,因为它会在生命周期移入和移出目标状态时停止并重新启动流收集。

与 LiveData 的比较 您可能已经注意到此 API 的行为与 LiveData 相似,这是真的!LiveData 知道生命周期,它的重新启动行为使其非常适合从 UI 观察数据流。Lifecycle.repeatOnLifecycle 和 Flow.flowWithLifecycle API 也是如此!

使用这些 API 收集流是纯 Kotlin 应用程序中 LiveData 的自然替代品。如果您使用这些 API 进行流收集,LiveData 不会比协程和流提供任何好处。更重要的是,流更加灵活,因为它们可以从任何 Dispatcher 收集,并且可以由它的所有操作员提供支持。与 LiveData 不同,LiveData 可用的运算符有限,并且始终从 UI 线程观察其值。

数据绑定中的 StateFlow 支持 另一方面,您可能使用 LiveData 的原因之一是因为它受数据绑定支持。好吧,StateFlow 也是如此!有关数据绑定中的 StateFlow 支持的更多信息,请查看官方文档。

使用 Lifecycle.repeatOnLifecycle 或 Flow.flowWithLifecycle API 从 Android 的 UI 层安全地收集流。

如果大伙有什么好的学习方法或建议欢迎大家在评论中积极留言哈,希望大家能够共同学习、共同努力、共同进步。

小编在这里祝小伙伴们在未来的日子里都可以 升职加薪,当上总经理,出任CEO,迎娶白富美,走上人生巅峰!!

不论遇到什么困难,都不应该成为我们放弃的理由!

很多人在刚接触这个行业的时候或者是在遇到瓶颈期的时候,总会遇到一些问题,比如学了一段时间感觉没有方向感,不知道该从那里入手去学习,需要一份小编整理出来的学习资料的关注我主页或者点击文末卡片免费领取~

这里是关于我自己的Android 学习,面试文档,视频收集大整理,有兴趣的伙伴们可以看看~

如果你看到了这里,觉得文章写得不错就给个赞呗?如果你觉得那里值得改进的,请给我留言,一定会认真查询,修正不足,谢谢。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值
>