[英]can we use runblocking with coroutine for room queries in production?
在我們的產品中,我們使用 MVP 模式和 Room 示例,經過長時間的搜索,我得到了所有使用 MVVM 的示例,但現在我發現這種方式可以使用 runblocking 運行我的 Room 查詢,一切運行順利我想知道這是使用的好方法協程,聽說生產環境不推薦runblocking
@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
在我的表助手中,我得到了這樣的結果
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 package 為生命周期所有者(活動、片段、視圖模型等)提供擴展 function。 因此,將lifecycleScope.launch
范圍.launch 用於 MVP 模式會很方便。 通過這種方式,當生命周期所有者不在其活動 state 中時,您的協程作業將自動取消。
所以,你的代碼可以是下面的生活:
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"
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.