首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >withContext(Dispatchers.IO)房间如何使用

withContext(Dispatchers.IO)房间如何使用
EN

Stack Overflow用户
提问于 2021-03-30 14:01:14
回答 3查看 1.1K关注 0票数 0

在我们的应用程序中有如此多的查询,现在我们正在使用房间,我想确认在我们像这样使用之前,什么是正确的使用Coroutine的方式

在Dao中

代码语言:javascript
复制
  @Query("SELECT * FROM VISITS")
    suspend fun getAllVisits(): List<Visits>

我们就会得到这样的结果

代码语言:javascript
复制
fun getAll(visit: Visits?) = runBlocking {
        Log.i(TAG, "addOrUpdateRecord")
        try {

val list = ArrayList<Visits>()
                list.addAll(async {
                    visitsDao.getAllVisits()
                }.await())

}

但在一些文章中,我读到运行阻塞仅用于测试,不用于生产,请指导我正确的方式谢谢

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2021-03-30 14:14:05

如果您需要一个协程作用域来启动一个协程,您可以根据需要随时使用lifecycleScopeviewModelScope

在活动中:

代码语言:javascript
复制
fun myMethod() {
    lifecycleScope.launch {
        val list = visitsDao.getAllVisits()
        //Do something with list here
            ...
    }
}

在片段中:

代码语言:javascript
复制
fun myMethod() {
    viewLifecycleOwner.lifecycleScope.launch {
        val list = visitsDao.getAllVisits()
        //Do something with list here
            ...
    }
}

在ViewModel中:

代码语言:javascript
复制
fun myMethod() {
    viewModelScope.launch {
        val list = visitsDao.getAllVisits()
        //Do something with list here
        ...
    }
}

在常规类中:

代码语言:javascript
复制
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()
    }
}
票数 3
EN

Stack Overflow用户

发布于 2021-03-30 14:05:32

您可以使用下面这样的内容

代码语言:javascript
复制
GlobalScope.launch { 
            withContext(Dispatchers.IO){
                // your query
            }
        }
票数 0
EN

Stack Overflow用户

发布于 2021-03-30 15:35:14

在Viewmodel中:

代码语言:javascript
复制
viewmodelScope.launch(Dispatchers.IO){
  visitsDao.getAllVisits()
}

或另一个挂起功能

代码语言:javascript
复制
suspend fun addAll() {
    visitsDao.getAllVisits().run{
     ArrayList<Visits>().addAll(this)

   }
}

EvenMore,只需使用flow,您可以使用livedata builder/map/asLiveData等。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66865525

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档