当前位置: 首页 > 知识库问答 >
问题:

Kotlin CoroutineScope初始化取决于使用自定义getter的CoroutineContext

姬昀
2023-03-14

谷歌codelab Android Room with a View-静态编程语言有以下片段:

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

    // ...

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

    private val scope = CoroutineScope(coroutineContext)

    // ...

}

根据我对这个答案的理解,自定义getter每次都会被评估,而赋值只在构建时评估。因此,实际上,范围将采用一个以后不会更改的值,那么对于coroutineContext的自定义getter有什么用呢?


共有2个答案

屠泰平
2023-03-14

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

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

微生承业
2023-03-14

当您在具有生命周期的组件(即AndroidActive)中定义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
    }
}

在这种情况下,您正在生命周期方法中创建作业,这就是为什么您需要计算属性来返回coroutineContext以及在中创建的作业实例。onCreate

 类似资料:
  • 本文向大家介绍Swift使用参数自定义初始化,包括了Swift使用参数自定义初始化的使用技巧和注意事项,需要的朋友参考一下 示例 请注意,您不能省略参数标签: 为了允许省略参数标签,请使用下划线_作为标签: 如果参数标签使用一个或多个属性共享名称,请使用self显式设置属性值:            

  • 如何向Swift中的子类添加自定义初始化器? 我创建了的一个子类,它看起来如下所示: 如果我加上这个,Xcode会抱怨处初始化。所以我想这也不是解决办法。所以我想知道如何在Swift中将自定义初始化器正确地添加到子类中(因为在Objective-C中这似乎不是问题)?

  • Swift 5.x String初始化、定义 1. 字面量初始化字符串 1.1 单行字面量字符串 let str = "some string" 1.2 字面量初始化多行字符串 let str = """ The white Rabbit put on his spectacles. "Where shell I begin, please your Majesty?" he asked. "

  • 问题内容: 在Java中,但是在其他OO语言中,初始化属性定义之间也有区别,例如 并使用构造函数对其进行初始化? 我想不出任何实际的区别,有没有?否则,即使结果相同,是否存在一种方法优于另一种方法的情况? 问题答案: 初始化顺序在这里很重要。 将字段设置为默认初始值(0,false,null) 调用对象的构造函数(但不要执行构造函数的主体) 调用超类的构造函数 使用初始化程序和初始化块初始化字段

  • 在kotlin中,我们可以使用以下两种方法和 什么时候使用哪种方法,这两种方法实际上是在下面进行的。哪一种方法是最好的?

  • 问题内容: 您如何初始化以下结构? 我试过了: 没用: 我试过了: 没用: 问题答案: 您是一个具有匿名结构类型的字段。因此,您必须重复类型定义: 但在大多数情况下,最好将其定义为rob74建议的单独类型。