如何从自定义视图访问主机片段的lifecycleScope?

问题描述

我需要在自定义视图中使用协程。观看完talk之后,我相信我最好的选择是使用 lifecycleScope 作为协程范围,以便在销毁生命周期所有者时将其自动取消。

但是,我似乎无法在自定义视图中访问lifecycleScope。根据{{​​3}},我们可以从 lifecycle 对象以lifecycle.coroutinescope或从 lifecycleOwner lifecycleOwner.lifecycleScope对其进行访问。但是自定义视图不是生命周期所有者。那么我可以以某种方式访问​​该片段的lifecycleScope吗?或者,如果不能,应该使用哪个协程上下文呢?

解决方法

我通过实现LifecycleObserver接口解决了这个问题。 free course on Udacity的第4课对如何使用LifecycleObserver接口制作具有生命周期意识的组件进行了很好的解释。

我在片段内部和自定义视图中注册了片段的生命周期,在获得生命周期的同时,我使用了生命周期来掌握lifecycleScope。

//Inside custom view
fun registerLifecycleOwner(lifecycle: Lifecycle){
    lifecycle.addObserver(this)
    scope = lifecycle.coroutineScope
}

//Inside fragment
binding.myCustomView.registerLifecycleOwner(lifecycle)

然后在自定义视图中,我像这样使用它:

scope.launch{ 
    //Do work
}