android launchWhenStarted和repeatOnLifecycle(STARTED)在收集流方面的区别

ndasle7k  于 2023-05-21  发布在  Android
关注(0)|答案(3)|浏览(432)

由于launchWhenStarted和repeatOnLifecycle(STARTED)提供了完全不同的功能(launchWhenStarted暂停执行协程,repeatOnLifecycle取消并重新启动新的协程),如果新API的名称相似(例如,使用launchWhenever重新启动API),开发人员可能会感到困惑,甚至在没有注意到的情况下互换使用它们。
source
什么是更简单的解释何时使用哪个?

qoefvg9y

qoefvg9y1#

launchWhenStarted只是一次延迟。
repeatOnLifecycle创建了一个挂起点,它充当一个处理程序,每当生命周期进入提供状态时,它就会运行提供的块,并在它低于提供状态时取消它(因此对于STARTED来说,它会在停止时发生)。

更新:

请注意,launchWhenStarted API现在已被弃用,因为它可能会导致工作挂起很长时间。
目前,对于一次性延迟,建议lifecycleScope.launch()一个新的作业,并在其中使用withStarted{ }方法来引起暂停,直到达到启动状态。
关于弃用和替换的详细解释在this google tracker issue中。

bfrts1fy

bfrts1fy2#

repeatOnLifecycle在每次重复时从头开始重新启动它的协程,并在每次生命周期福尔斯指定状态时取消它。它非常适合收集大多数流,因为它在不需要流时完全取消流,这节省了与继续发出值的流相关的资源。
launchWhenX不会取消协程并重新启动它。它只是在启动时延迟,并在低于指定状态时暂停执行。他们计划弃用这些函数,但我怀疑如果他们这样做,就需要一些替代品,因为你正在调用一些耗时的suspend函数,然后想在完成后做一些事情,比如启动一个片段事务。为此使用repeatOnLifecycle将导致重做耗时的操作。

ovfsdjhp

ovfsdjhp3#

channel支持的冷流或使用带有缓冲区的运算符(如bufferconflateflowOnshareIn,使用某些现有API(如CoroutineScope.launchFlow<T>.launchInLifecycleCoroutineScope.launchWhenX)收集是不安全的。除非您在Activity转到后台时手动取消启动协程的Job。这些API将保持底层流生产者活动,同时在后台将项目发送到缓冲区,从而浪费资源。
要使用这些API解决此问题,您需要在视图转到后台时手动取消收集。但听起来像是样板代码
这就是为什么Google推荐repeatOnLifecycle(Lifecycle.State.XXX)来使其简单和安全。
repeatOnLifecycle是一个suspend函数,它接受一个Lifecycle.State作为参数,用于在生命周期到达state自动创建并启动一个新的协程,并在生命周期福尔斯该状态时取消正在执行该块的协程
here了解更多

相关问题