【问题标题】:Android: kotlin coroutine background taskAndroid:kotlin协程后台任务
【发布时间】:2020-07-30 11:29:54
【问题描述】:

我有办法

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

这是使用协程的正确方式吗?数据库操作是否发生在后台范围内

【问题讨论】:

    标签: android kotlin kotlin-coroutines


    【解决方案1】:

    如果您使用的是 Room,其文档说明如下:

    您可以将暂停 Kotlin 关键字添加到您的 DAO 方法中以使 它们使用 Kotlin 协程功能进行异步处理。这确保 它们不能在主线程上执行。

    因此,您可以安全地在 viewModelScope 中调用您的存储库,而无需更改上下文。

    您可以找到 Room 的文档部分 here

    【讨论】:

    • 我有这些方法作为@Transaction。那么这是否意味着我可以将它们称为 fun refrehList() { viewModelScope.launch { myData.value = summaryRepository.getSummaries(true) allData.value = SummaryRepository.getSummaries(false) } }
    • @png 当然,您可以在我提供的链接中看到一个示例是一个事务,它实际上说明了以下内容:本指南也适用于带有 @ 注释的 DAO 方法987654323@。您可以使用此功能从其他 DAO 方法构建暂停数据库方法。然后这些方法在单个数据库事务中运行。
    【解决方案2】:

    是的,这段代码将在单独的线程上运行,但一个接一个。此外,您应该使用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

    【讨论】:

      猜你喜欢
      • 2020-11-07
      • 1970-01-01
      • 1970-01-01
      • 2012-06-15
      • 1970-01-01
      • 2011-09-29
      • 2011-09-15
      • 2013-02-04
      • 2017-10-01
      相关资源
      最近更新 更多