3

google codelab Android Room with a View - Kotlin有以下代码段

class WordViewModel(application: Application) : AndroidViewModel(application) {

    // ...

    private val coroutineContext: CoroutineContext
       get() = parentJob + Dispatchers.Main

    private val scope = CoroutineScope(coroutineContext)

    // ...

}

根据我从这个答案中了解到的情况,每次都会评估自定义 getter,而仅在构建时评估分配。所以实际上,scope会采用一个以后不会改变的值,那么自定义 getter 有什么用coroutineContext

4

2 回答 2

2

我认为在这个例子中我们可以摆脱

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 是一种风格问题。如果我们删除它,什么都不会改变。

于 2019-01-18T20:22:57.120 回答
2

当您在具有生命周期的组件(即 Android )中定义 a 时,将其定义coroutineContext为计算属性(或自定义 getter)更有意义。Javadoc中的示例是不言自明的:CoroutineScopeActivity

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
    }
}

在这种情况下,您是Job在生命周期方法中创建 ,这就是为什么您需要计算属性来返回在中创建coroutineContextJob实例onCreate

于 2019-01-18T20:30:16.733 回答