【发布时间】:2019-08-04 08:41:40
【问题描述】:
只是想知道其他人的意见我有两种方法可以做某事并且很好奇哪种方法更好(希望你为什么这么认为)
我有 2 个文件 WordRepository 和 WordViewModel。我可以在 Repo 或 ViewModel 中执行协程,这两种方式都可以工作,但希望有人能告诉我为什么我会在其中一种中执行协程,反之亦然。
版本 A.(协程在 Repo 中的位置)
WordRepo:
class WordRepository(private val wordDao: WordDao): WordRepo {
@WorkerThread
override suspend fun deleteAllLogsOlderThan(XDays: Int): Int = withContext(IO) {
return@withContext wordDao.deleteAll()
}
}
WordViewModel:
class WordViewModel(private val wordRepository: WordRepo) : ViewModel() {
fun deleteAllLogsOlderThanA(XDays:Int): Int = runBlocking {
wordRepository.deleteAllLogsOlderThan(XDays)
}
}
版本 B.(协程在 ViewModel 中的位置)
Word Repo:
class WordRepository(private val wordDao: WordDao): WordRepo {
@WorkerThread
override suspend fun deleteAllLogsOlderThan(XDays: Int): Int = wordDao.deleteAll()
}
WordViewModel:
class WordViewModel(private val wordRepository: WordRepo) : ViewModel() {
fun deleteAllLogsOlderThanA(XDays:Int): Int = runBlocking {
withContext(IO) {
wordRepository.deleteAllLogsOlderThan(XDays)
}
}
}
【问题讨论】:
-
runBlocking阻塞当前线程,确定要使用吗? -
我还能如何调用 withContext 并获得响应不能使用启动,因为它返回工作?
-
launch用于启动非阻塞协程。如果您不希望您的函数返回Job,您可以创建一个包装launch调用并返回Unit的函数。 -
使用协程你不能在不阻塞线程的情况下返回值。如果您在
ViewModel中有MutableLiveData对象,您可以使用它来更新 UI:launch { liveData.value = wordRepository.deleteAllLogsOlderThan(XDays)} -
我更喜欢使用本地范围在
ViewModel或Presenter中启动协程。这样在WordViewModel的deleteAllLogsOlderThanA函数中启动了一个协程
标签: android mvvm kotlin android-room coroutine