Estoy creando una aplicación que interactúa con SQLite Via Room. Dado que la operación de la base de datos no se pudo ejecutar en el hilo principal, lo hago dentro de un doAsync. Aqui esta mi codigo

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

    }

Todo está bien, pero como ves, hago muchos doAsync y runOnUiThread anidados. ¿Existe alguna solución mejor ?. He intentado de otra manera, esta es la única forma en que mi aplicación funciona bien.

0
Matius Nugroho Aryanto 27 sep. 2019 a las 07:58

1 respuesta

La mejor respuesta

Puede acceder a las variables de actividad en la función de fondo / asíncrono, no es necesario utilizar runOnUiThread para eso. Solo los cambios relacionados con la vista o la interfaz de usuario deben estar en el hilo de la interfaz de usuario. Creo que su código se puede simplificar para-

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

Sin embargo, tienes que comprobarlo tú mismo.

1
Gulshan 27 sep. 2019 a las 06:53