Android如何重构嵌套的doAsync

时间:2019-09-27 04:58:59

标签: android kotlin

我正在创建一个与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) }
                            }
                        }
                    }
                }
            }
        }

    }

一切正常,但是正如您所见,我做了许多嵌套的doAsyncrunOnUiThread。有没有更好的解决方案?我尝试了其他方法,这是我的应用正常运行的唯一方法。

1 个答案:

答案 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) }
    }  
}

但是您必须检查一下自己。