问题描述
我需要在自定义视图中使用协程。观看完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
}