代码之家  ›  专栏  ›  技术社区  ›  aksh1618

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

  •  3
  • aksh1618  · 技术社区  · 6 年前

    谷歌代码实验室 带视野的Android房间-Kotlin 有以下内容 snippet :

    class WordViewModel(application: Application) : AndroidViewModel(application) {
    
        // ...
    
        private val coroutineContext: CoroutineContext
           get() = parentJob + Dispatchers.Main
    
        private val scope = CoroutineScope(coroutineContext)
    
        // ...
    
    }
    

    据我所知 this 答:每次都对自定义getter进行评估,而仅在构造时对分配进行评估。所以实际上, scope 将采用以后不会更改的值,因此自定义getter的用途是 coroutineContext ?

    2 回复  |  直到 6 年前
        1
  •  1
  •   Omar Mainegra    6 年前

    定义 coroutineContext 作为计算属性(或自定义getter),在定义 CoroutineScope 在具有生命周期(即Android)的组件中 Activity )中的示例 贾瓦多克 不言自明:

    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 在生命周期方法中,这就是为什么需要计算属性返回 协同工作上下文 工作 实例创建于 onCreate .

        2
  •  1
  •   Sergio    6 年前

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

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