我正在创建一个与sqlite Via Room交互的应用程序。由于数据库操作无法在主线程上运行,因此我在doAsync
内进行操作。这是我的代码
private fun onItemClick(item:ProductModel){
//check chart, if not empty add to current chart
val transaction = Transaction(context!!)
var transactionModel:TransactionTempModel?
doAsync {
var isChartEmpty = transaction.isChartEmpty()
activity?.runOnUiThread {
if(isChartEmpty){
doAsync {
transactionModel=transaction.newTransaction()
activity?.runOnUiThread {
doAsync {
val result = transaction.addToChart(transactionModel!!,item)
activity?.runOnUiThread { dialogChartAddition(result) }
}
}
}
}
else{
doAsync {
transactionModel = transaction.getCurrenTransaction()
activity?.runOnUiThread {
doAsync {
val result=transaction.addToChart(transactionModel!!,item)
activity?.runOnUiThread { dialogChartAddition(result) }
}
}
}
}
}
}
}
一切正常,但是正如您所见,我做了许多嵌套的doAsync
和runOnUiThread
。有没有更好的解决方案?我尝试了其他方法,这是我的应用正常运行的唯一方法。
答案 0 :(得分:1)
您可以在后台/异步功能中访问活动变量,而无需使用runOnUiThread
。只有与视图或UI相关的更改必须在UI线程上。我认为您的代码可以简化为-
private fun onItemClick(item:ProductModel) {
val transaction = Transaction(context!!)
doAsync {
var isChartEmpty = transaction.isChartEmpty()
val transactionModel =
if(isChartEmpty) transaction.newTransaction()
else transaction.getCurrenTransaction()
val result = transaction.addToChart(transactionModel!!, item)
activity?.runOnUiThread { dialogChartAddition(result) }
}
}
但是您必须检查一下自己。