Android Как провести рефакторинг вложенных doAsync - PullRequest
0 голосов
/ 27 сентября 2019

Я создаю приложение, которое взаимодействует с 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.Есть ли лучшее решение?Я пробовал по-другому, только так мое приложение работает хорошо.

1 Ответ

1 голос
/ 27 сентября 2019

Вы можете получить доступ к переменным активности в фоновой / асинхронной функции, для этого не нужно использовать runOnUiThread.В потоке пользовательского интерфейса должны быть только изменения, связанные с просмотром или пользовательским интерфейсом.Я думаю, что ваш код может быть упрощен до -

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

Вы должны проверить себя, хотя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...