Android:Kotlin协程后台任务

4

我有一个方法

fun refrehList() {
    viewModelScope.launch {
        myData.value = withContext(Dispatchers.Default) {
            summaryRepository.getSummaries(true)
        }
        allData.value = withContext(Dispatchers.Default) {
            SummaryRepository.getSummaries(false)
        }
    }
}

这是使用协程的正确方法吗?数据库操作是否在后台作用域中进行?

2个回答

4
如果你正在使用 Room,它的文档说明如下:
你可以在 DAO 方法中添加 suspend Kotlin 关键字,并利用 Kotlin 协程功能使它们异步化。这可以确保它们不会在主线程上执行。
因此,您可以在 viewModelScope 中调用您的 repository 而不需要更改上下文。
你可以在 Room 的文档部分这里找到相关信息。

我已将这些方法标记为@Transaction。那么这是否意味着我可以像这样调用它们fun refrehList() { viewModelScope.launch { myData.value = summaryRepository.getSummaries(true) allData.value = SummaryRepository.getSummaries(false) }} - png
@png 当然,您可以在我提供的链接中看到一个示例是一个事务,并且它实际上声明了以下内容:此指南也适用于带有@Transaction注释的DAO方法。您可以使用此功能将其他DAO方法构建为暂停数据库方法。然后,这些方法在单个数据库事务中运行。 - Glenn Sandoval

3

是的,这段代码将在不同的线程上运行,但一个接着一个地运行。此外,你应该使用 Dispatchers.IO 来进行数据库调用,而不是使用 Dispatchers.Default。参见Io vs Default

viewModelScope.launch {
        myData.value = withContext(Dispatchers.IO) {
           Log.e("thread1", Thread.currentThread().name)
            summaryRepository.getSummaries(true)
        }
         Log.e("thread2", Thread.currentThread().name)
        allData.value = withContext(Dispatchers.IO) {
           Log.e("thread3", Thread.currentThread().name)
            SummaryRepository.getSummaries(false)
        }
    }

这将会打印出类似于:- 的内容。
E/thread: DefaultDispatcher-worker-1
E/thread2: main
E/thread3: DefaultDispatcher-worker-1

如果你想并行运行这些协程,可以使用async-await


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接