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
?
Я думаю, что в этом примере мы можем избавиться от
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 ] Я полагаю, что в данном случае писать геттер - дело стиля. Ничего не изменится, если мы удалим это.
Определение 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
.