Код A взят из примеров архитектуры проекта в https://github.com/android/architecture-samples
1: я не знаю, нужно ли просто обернуть функцию activateTask(task: Task)
в runBlocking
как код B. Я боюсь, что activateTask(task: Task)
, возможно, не будет запущен, если объект DefaultTasksRepository
быстро уничтожается.
2: Обычно я запускаю сопрограммы в ViewModel.viewModelScope
, я не знаю, ViewModel.viewModelScope
будет уничтожено, когда я закончу sh приложение, и будут ли уничтожены сопрограммы, работающие в ViewModel.viewModelScope
. Если это так, я думаю, что это будет плохо, некоторые сопрограммы, такие как запись данных на удаленный сервер, будут отменены.
3: И еще, функция activateTask
в коде A является функцией сопрограмм, она может напрямую вызывать другую функцию сопрограмм, поэтому я думаю, что код A + правильный, верно?
код A
import kotlinx.coroutines.coroutineScope
...
class DefaultTasksRepository(
private val tasksRemoteDataSource: TasksDataSource,
private val tasksLocalDataSource: TasksDataSource,
private val ioDispatcher: CoroutineDispatcher = Dispatchers.IO
) : TasksRepository {
...
override suspend fun activateTask(task: Task) = withContext<Unit>(ioDispatcher) {
coroutineScope {
launch { tasksRemoteDataSource.activateTask(task) }
launch { tasksLocalDataSource.activateTask(task) }
}
}
override suspend fun clearCompletedTasks() {
coroutineScope {
launch { tasksRemoteDataSource.clearCompletedTasks() }
launch { tasksLocalDataSource.clearCompletedTasks() }
}
}
...
}
код A +
import kotlinx.coroutines.coroutineScope
...
class DefaultTasksRepository(
private val tasksRemoteDataSource: TasksDataSource,
private val tasksLocalDataSource: TasksDataSource,
private val ioDispatcher: CoroutineDispatcher = Dispatchers.IO
) : TasksRepository {
...
override suspend fun activateTask(task: Task) = withContext<Unit>(ioDispatcher) {
tasksRemoteDataSource.activateTask(task)
tasksLocalDataSource.activateTask(task)
}
override suspend fun clearCompletedTasks() {
tasksRemoteDataSource.clearCompletedTasks()
tasksLocalDataSource.clearCompletedTasks()
}
...
}
код B
fun main() = runBlocking {
launch {
delay(1000L)
println("World!")
}
println("Hello,")
}