Инициализация Kotlin CoroutineScope в зависимости от CoroutineContext с пользовательским геттером

Google Codelab Android Room с видом - Kotlin имеет следующий фрагмент :

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

    // ...

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

    private val scope = CoroutineScope(coroutineContext)

    // ...

}

. 114] ответ, пользовательский геттер оценивается каждый раз, тогда как задание оценивается только во время конструирования. Таким образом, в действительности scope будет принимать значение, которое не изменится позже, так что для чего использовать пользовательский метод получения для coroutineContext?

3
задан aksh1618 18 January 2019 в 20:05
поделиться

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)
    // ...
}
[116 ] Я полагаю, что в данном случае писать геттер - дело стиля. Ничего не изменится, если мы удалим это.

0
ответ дан Sergey 18 January 2019 в 20:05
поделиться

Определение coroutineContext как вычисляемого свойства (или пользовательского геттера) имеет больше смысла, когда вы определяете CoroutineScope в компоненте с жизненным циклом (то есть 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
    }
}

В этом случае вы создаете Job в методе жизненного цикла, поэтому вам необходимо вычисленное свойство для возврата coroutineContext с экземпляром Job, созданным в onCreate.

0
ответ дан Omar Mainegra 18 January 2019 в 20:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: