在生产中进行空间查询时,我们可以将协程使用runblocking吗? [英] can we use runblocking with coroutine for room queries in production?

查看:86
本文介绍了在生产中进行空间查询时,我们可以将协程使用runblocking吗?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在我们的产品中,我们使用MVP模式,在Room示例中,经过长时间的搜索,我得到了MVVM的所有示例,但是现在我发现了这种方法,可以使用runblocking一切顺利进行来运行Room查询,我想知道这很好使用协程的方式,我听说不建议在生产中使用runblocking

In our product we are using MVP pattern and in Room examples and after long searching I am getting all example with MVVM but now I found this way to run my Room queries using runblocking everything working smoothly I want to know that is this good way to use coroutines, I have heard that runblocking is not recommended for production

@Query("""SELECT V.* FROM VISITS AS V LEFT JOIN ORDERS AS O ON O.visitId = V.visitId 
        WHERE V.visitComplete = 1 AND V.visitId = :visitId AND (V.shopClosed = 1 OR O.orderTotal > 0)""")
suspend fun getCompletedVisitByVisitId(visitId: Int): Visits

在我的表格助手中,我得到这样的结果

And in my table Helper I am getting result like this

fun getCompletedVisitByVisitId(visitId: Int): Visits? = runBlocking {

    var data: Visits? = null
    try {
        data = async {
            visitsDao.getCompletedVisitByVisitId(visitId)
        }.await()
    } catch (e: SQLException) {
        CustomMethods.errorLog(e, "getCompletedVisitByVisitId", ErrorLog.TYPE_ERROR, ErrorLog.APPLICATION_ERROR, context)
        e.printStackTrace()
    }
    data
}

override fun getCompletedVisitByVisitId(visitId: Int): Visits? {
        return visitsTableHelper!!.getCompletedVisitByVisitId(visitId)
    }

推荐答案

androidx.lifecycle包为生命周期所有者(活动,片段,视图模型等)提供了扩展功能.因此,将 lifecycleScope.launch 用于MVP模式将很方便.这样,当生命周期所有者未处于活动状态时,您的协程作业将自动被取消.

androidx.lifecycle package provides extension function for lifecycle owners (activity,fragment,viewmodel etc). So, it would be convenient to to use the lifecycleScope.launch for MVP pattern. By this way your coroutine jobs will automatically get canceled when the lifecycle owner is not in its active state.

因此,您的代码可以生活在下面:

So, you code can be life below:

override fun onCreate(savedInstanceState: Bundle?) {
    ...
    .....
    lifecycleScope.launch {
       try {
          val visits = getCompletedVisitByVisitId(someNumber)
          // do something with your data
       } catch (e: Exception) {
          //handle exception 
       }
    }
}
suspend fun getCompletedVisitByVisitId(visitId: Int): Visits? {

    var data: Visits? = null
    try {
        data = visitsDao.getCompletedVisitByVisitId(visitId)
    } catch (e: SQLException) {
        CustomMethods.errorLog(e, "getCompletedVisitByVisitId", ErrorLog.TYPE_ERROR, ErrorLog.APPLICATION_ERROR, context)
        e.printStackTrace()
    }
    data
}

还导入依赖项:

def lifecycle_version = "2.3.1"
implementation "androidx.lifecycle:lifecycle-runtime-ktx:$lifecycle_version"

这篇关于在生产中进行空间查询时,我们可以将协程使用runblocking吗?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆