Android Kotlin CoroutineScope初始化取决于带有自定义getter的CoroutineContext

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

google codelab Android房间,可查看Kotlin的以下内容:


从答案中我了解到,自定义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)更有意义(即Android
Activity
)。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
    }
}