【问题标题】:Kotlin CoroutineScope initialization depending upon CoroutineContext with custom getterKotlin CoroutineScope 初始化依赖于 CoroutineContext 和自定义 getter
【发布时间】:2019-06-13 02:06:46
【问题描述】:

google codelab Android Room with a View - Kotlin 有以下snippet

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

    // ...

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

    private val scope = CoroutineScope(coroutineContext)

    // ...

}

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

【问题讨论】:

    标签: android kotlin kotlin-coroutines android-viewmodel coroutinescope


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      当您在具有生命周期的组件(即 Android Activity)中定义 CoroutineScope 时,将 coroutineContext 定义为计算属性(或自定义 getter)更有意义。 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
          }
      }
      

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-10-09
        • 1970-01-01
        • 2013-07-27
        • 2021-02-19
        • 2011-03-05
        • 1970-01-01
        相关资源
        最近更新 更多