在我们的应用程序中有如此多的查询,现在我们正在使用房间,我想确认在我们像这样使用之前,什么是正确的使用Coroutine的方式
在Dao中
@Query("SELECT * FROM VISITS")
suspend fun getAllVisits(): List<Visits>我们就会得到这样的结果
fun getAll(visit: Visits?) = runBlocking {
Log.i(TAG, "addOrUpdateRecord")
try {
val list = ArrayList<Visits>()
list.addAll(async {
visitsDao.getAllVisits()
}.await())
}但在一些文章中,我读到运行阻塞仅用于测试,不用于生产,请指导我正确的方式谢谢
发布于 2021-03-30 14:14:05
如果您需要一个协程作用域来启动一个协程,您可以根据需要随时使用lifecycleScope或viewModelScope。
在活动中:
fun myMethod() {
lifecycleScope.launch {
val list = visitsDao.getAllVisits()
//Do something with list here
...
}
}在片段中:
fun myMethod() {
viewLifecycleOwner.lifecycleScope.launch {
val list = visitsDao.getAllVisits()
//Do something with list here
...
}
}在ViewModel中:
fun myMethod() {
viewModelScope.launch {
val list = visitsDao.getAllVisits()
//Do something with list here
...
}
}在常规类中:
class MyPresenter: CoroutineScope {
private val myJob = Job()
override val coroutineContext: CoroutineContext
get() = Dispatchers.Default + myJob
...
fun myMethod() {
launch {
val list = visitsDao.getAllVisits()
//Do something with list here
...
}
}
...
//Call clear when required
fun clear() {
this.myJob.cancel()
}
}发布于 2021-03-30 14:05:32
您可以使用下面这样的内容
GlobalScope.launch {
withContext(Dispatchers.IO){
// your query
}
}发布于 2021-03-30 15:35:14
在Viewmodel中:
viewmodelScope.launch(Dispatchers.IO){
visitsDao.getAllVisits()
}或另一个挂起功能
suspend fun addAll() {
visitsDao.getAllVisits().run{
ArrayList<Visits>().addAll(this)
}
}EvenMore,只需使用flow,您可以使用livedata builder/map/asLiveData等。
https://stackoverflow.com/questions/66865525
复制相似问题