Android Kotlin CoroutineScope初始化取决于带有自定义getter的CoroutineContext
google codelab Android房间,可查看Kotlin的以下内容:Android Kotlin CoroutineScope初始化取决于带有自定义getter的CoroutineContext,android,kotlin,kotlinx.coroutines,Android,Kotlin,Kotlinx.coroutines,google codelab Android房间,可查看Kotlin的以下内容: 从答案中我了解到,自定义getter每次都会被评估,而赋值只在构建时被评估。因此实际上,scope将接受一个以后不会更改的值,那么coroutineContext的自定义getter有什么用呢?我认为在这个示例中我们可以去掉它 private val coroutineContext: CoroutineContext get() = parentJob + Dispatchers.Main 就写吧 pri
从答案中我了解到,自定义getter每次都会被评估,而赋值只在构建时被评估。因此实际上,
scope
将接受一个以后不会更改的值,那么coroutineContext
的自定义getter有什么用呢?我认为在这个示例中我们可以去掉它
private val coroutineContext: CoroutineContext
get() = parentJob + Dispatchers.Main
就写吧
private val scope = CoroutineScope(parentJob + Dispatchers.Main)
因此,结果代码如下所示:
class WordViewModel(application: Application) : AndroidViewModel(application) {
private var parentJob = Job()
private val scope = CoroutineScope(parentJob + Dispatchers.Main)
// ...
}
在这种情况下,我想写getter是风格的问题。如果我们删除它,什么都不会改变。当您在具有生命周期的组件中定义
CoroutineScope
时,将coroutineContext
定义为计算属性(或自定义getter)更有意义(即AndroidActivity
)。Javadoc中的示例不言自明:
class MyActivity : AppCompatActivity(), CoroutineScope {
lateinit var job: Job
override val coroutineContext: CoroutineContext
get() = Dispatchers.Main + job
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
job = Job()
}
override fun onDestroy() {
super.onDestroy()
job.cancel() // Cancel job on activity destroy. After destroy all children jobs will be cancelled automatically
}
}
在本例中,您是在生命周期方法中创建作业
,这就是为什么需要computed属性返回coroutineContext
,以及在onCreate
中创建的作业
实例
class MyActivity : AppCompatActivity(), CoroutineScope {
lateinit var job: Job
override val coroutineContext: CoroutineContext
get() = Dispatchers.Main + job
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
job = Job()
}
override fun onDestroy() {
super.onDestroy()
job.cancel() // Cancel job on activity destroy. After destroy all children jobs will be cancelled automatically
}
}