由于launchWhenStarted和repeatOnLifecycle(STARTED)提供了完全不同的功能(launchWhenStarted暂停执行协程,repeatOnLifecycle取消并重新启动新的协程),如果新API的名称相似(例如,使用launchWhenever重新启动API),开发人员可能会感到困惑,甚至在没有注意到的情况下互换使用它们。source什么是更简单的解释何时使用哪个?
qoefvg9y1#
launchWhenStarted只是一次延迟。repeatOnLifecycle创建了一个挂起点,它充当一个处理程序,每当生命周期进入提供状态时,它就会运行提供的块,并在它低于提供状态时取消它(因此对于STARTED来说,它会在停止时发生)。
launchWhenStarted
repeatOnLifecycle
STARTED
更新:
请注意,launchWhenStarted API现在已被弃用,因为它可能会导致工作挂起很长时间。目前,对于一次性延迟,建议lifecycleScope.launch()一个新的作业,并在其中使用withStarted{ }方法来引起暂停,直到达到启动状态。关于弃用和替换的详细解释在this google tracker issue中。
lifecycleScope.launch()
withStarted{ }
bfrts1fy2#
repeatOnLifecycle在每次重复时从头开始重新启动它的协程,并在每次生命周期福尔斯指定状态时取消它。它非常适合收集大多数流,因为它在不需要流时完全取消流,这节省了与继续发出值的流相关的资源。launchWhenX不会取消协程并重新启动它。它只是在启动时延迟,并在低于指定状态时暂停执行。他们计划弃用这些函数,但我怀疑如果他们这样做,就需要一些替代品,因为你正在调用一些耗时的suspend函数,然后想在完成后做一些事情,比如启动一个片段事务。为此使用repeatOnLifecycle将导致重做耗时的操作。
launchWhenX
ovfsdjhp3#
由channel支持的冷流或使用带有缓冲区的运算符(如buffer、conflate、flowOn或shareIn),使用某些现有API(如CoroutineScope.launch、Flow<T>.launchIn或LifecycleCoroutineScope.launchWhenX)收集是不安全的。除非您在Activity转到后台时手动取消启动协程的Job。这些API将保持底层流生产者活动,同时在后台将项目发送到缓冲区,从而浪费资源。要使用这些API解决此问题,您需要在视图转到后台时手动取消收集。但听起来像是样板代码这就是为什么Google推荐repeatOnLifecycle(Lifecycle.State.XXX)来使其简单和安全。repeatOnLifecycle是一个suspend函数,它接受一个Lifecycle.State作为参数,用于在生命周期到达state时自动创建并启动一个新的协程,并在生命周期福尔斯该状态时取消正在执行该块的协程。从here了解更多
channel
buffer
conflate
flowOn
shareIn
CoroutineScope.launch
Flow<T>.launchIn
LifecycleCoroutineScope.launchWhenX
Job
repeatOnLifecycle(Lifecycle.State.XXX)
Lifecycle.State
state
3条答案
按热度按时间qoefvg9y1#
launchWhenStarted
只是一次延迟。repeatOnLifecycle
创建了一个挂起点,它充当一个处理程序,每当生命周期进入提供状态时,它就会运行提供的块,并在它低于提供状态时取消它(因此对于STARTED
来说,它会在停止时发生)。更新:
请注意,
launchWhenStarted
API现在已被弃用,因为它可能会导致工作挂起很长时间。目前,对于一次性延迟,建议
lifecycleScope.launch()
一个新的作业,并在其中使用withStarted{ }
方法来引起暂停,直到达到启动状态。关于弃用和替换的详细解释在this google tracker issue中。
bfrts1fy2#
repeatOnLifecycle
在每次重复时从头开始重新启动它的协程,并在每次生命周期福尔斯指定状态时取消它。它非常适合收集大多数流,因为它在不需要流时完全取消流,这节省了与继续发出值的流相关的资源。launchWhenX
不会取消协程并重新启动它。它只是在启动时延迟,并在低于指定状态时暂停执行。他们计划弃用这些函数,但我怀疑如果他们这样做,就需要一些替代品,因为你正在调用一些耗时的suspend函数,然后想在完成后做一些事情,比如启动一个片段事务。为此使用repeatOnLifecycle
将导致重做耗时的操作。ovfsdjhp3#
由
channel
支持的冷流或使用带有缓冲区的运算符(如buffer
、conflate
、flowOn
或shareIn
),使用某些现有API(如CoroutineScope.launch
、Flow<T>.launchIn
或LifecycleCoroutineScope.launchWhenX
)收集是不安全的。除非您在Activity转到后台时手动取消启动协程的Job
。这些API将保持底层流生产者活动,同时在后台将项目发送到缓冲区,从而浪费资源。要使用这些API解决此问题,您需要在视图转到后台时手动取消收集。但听起来像是样板代码
这就是为什么Google推荐
repeatOnLifecycle(Lifecycle.State.XXX)
来使其简单和安全。repeatOnLifecycle
是一个suspend函数,它接受一个Lifecycle.State
作为参数,用于在生命周期到达state
时自动创建并启动一个新的协程,并在生命周期福尔斯该状态时取消正在执行该块的协程。从here了解更多