launchWhenStarted 和 repeatOnLifecycle(STARTED) 采集流的区别

Difference between launchWhenStarted and repeatOnLifecycle(STARTED) in collecting flows

As launchWhenStarted and repeatOnLifecycle(STARTED) provide completely different functionality (launchWhenStarted suspends the execution of the coroutine, and repeatOnLifecycle cancels and restarts a new coroutine), if the names of the new APIs were similar (for example, using launchWhenever for the restarting APIs), developers could’ve got confused and even use them interchangeably without noticing.

source

什么时候使用哪个更简单的解释是什么?

launchWhenStarted只是一次延迟。

repeatOnLifecycle 创建一个挂起点作为处理程序,每次生命周期进入提供的状态时运行提供的块,并在它低于它时取消它(因此对于 STARTED 它发生在它得到时停止)。

repeatOnLifecycle 在每次重复时从头开始重新启动协程,并在每次生命周期低于指定状态时取消协程。它非常适合收集大多数流,因为它会在不需要时完全取消流,从而节省与继续发出值的流相关的资源。

launchWhenX 不会取消协程并重新启动它。它只是在启动时推迟,并在低于指定状态时暂停执行。他们计划弃用这些函数,但我怀疑如果他们这样做的话,将需要一些替代品,因为你正在调用一些耗时的挂起函数,然后想在它完成时做一些事情,比如开始一个片段事务。为此使用 repeatOnLifecycle 将导致重做耗时的操作。