gpt4 book ai didi

android - 如何在有空间的情况下执行繁重的数据库操作?

转载 作者:行者123 更新时间:2023-12-02 12:52:38 28 4
gpt4 key购买 nike

我正在使用房间数据库来运行一些繁重的数据库操作。我没有将 LiveData 用于此操作,因为我仅将结果用于计算。现在,如果在我的主要 fragment 中我有这个

override fun onActivityCreated(savedInstanceState: Bundle?) {
lifecycleScope.launch {
val result = viewModel.someHeavyOperation() // a suspend fun
doSomething(result)
}
}

我得到一个 Skipped xx frames! Your application might be doing to much work on main thread.在启动时,如果我省略了数据库查询,我就不会得到。

现在这里有一些答案,例如 this onethat one似乎建议在 IO 线程上运行查询,例如

override fun onActivityCreated(savedInstanceState: Bundle?) {
lifecycleScope.launch {
withContext(Dispatchers.IO) {
val result = viewModel.someHeavyOperation() // a suspend fun
}
doSomething(result)
}
}

这确实提高了我的表现。但让我困惑的是在 an article 中由 android 开发人员在媒体上发表,它说

Note: Room uses its own dispatcher to run queries on a background thread. Your code should not use withContext(Dispatchers.IO) to call suspending room queries. It will complicate the code and make your queries run slower.



然而,他们似乎只考虑昂贵的位是随后的计算的情况,他们似乎提出了类似的建议

override fun onActivityCreated(savedInstanceState: Bundle?) {
lifecycleScope.launch {
val result = viewModel.someOperation() // a suspend fun
withContext(Dispatchers.Default) {
doSomethingHeavy(result)
}
}
}

所以现在我的问题:
  • 如果 room 无论如何都使用自定义调度程序,为什么从哪个调度程序房间查询调用很重要?
  • 如何在不阻塞主线程的情况下执行昂贵的房间查询?
  • 最佳答案

    Why should it matter from which dispatcher room queries are called if room uses a custom dispatcher anyways?



    房间介绍 Kotlin Coroutine版本支持 2.1向前。早些时候,他们不支持 Coroutine .所以,首先要确定你的房间版本是不是 2.1或以上来自 build.gradle文件 :
    implementation "androidx.room:room-coroutines:${versions.room}"

    如果您使用的是 Room早于 2.1 的版本,然后 Room将在调用者线程上执行操作。这意味着如果我们在 MAIN 上给出 Room 的查询调用线程,它将在 MAIN 上执行操作.如果我们在 IO - background 上给 Room 打电话线程,它将在 background 上执行.

    How to perform expensive room queries without blocking the main thread?



    为此,我们应该在 IO 上调用 Room 查询。线。你已经在做正确的事情
    override fun onActivityCreated(savedInstanceState: Bundle?) {
    lifecycleScope.launch {
    withContext(Dispatchers.IO) {
    val result = viewModel.someHeavyOperation() // a suspend fun
    }
    doSomething(result)
    }
    }

    除此之外,如果您需要添加等待直到房间查询调用返回,您可以使用 async发射器和 await()方法
    override fun onActivityCreated(savedInstanceState: Bundle?) {
    lifecycleScope.launch {
    val content = async(Dispatchers.IO) {
    viewModel.someHeavyOperation() // a suspend fun
    }
    // Using below line, we are introducing waiting for completion of someHeavyOperation() on IO thread
    // If we return any result from someHeavyOperation(), it can be accessed in result variable as below
    var result = content.await()
    }
    }
    }

    引用 :
  • https://stackoverflow.com/a/59376666/1994950
  • https://stackoverflow.com/a/59408634/1994950
  • 关于android - 如何在有空间的情况下执行繁重的数据库操作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59541100/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com