在修改之前如何在AsyncTask中使用变量?

时间:2019-09-09 18:17:41

标签: android asynchronous kotlin android-asynctask

我想在AsyncTask中使用我的类的参数,但是此参数仅在AsyncTask之后更改。因此,当执行AsyncTask时,此变量已经更改,我使用的是新参数值,而不是旧参数。

我试图使用AsyncTask.execute {}创建一个扩展AsyncTask的类,但无济于事。

data class Case(var id: Long, var nom: String, var nomCourt: String, var couleur: String, var couleurTexte: String, var prix: Double, var nombre: Int = 0)
class Moteur(): Parcelable {
    //I didn't past the code of the Parcelable, because it doesn't matter to this problem.
    var cases : List<Case> = listOf(
        Case(0, "Bouchon 1", "B1", "#008000", "#FFFFFF", 5.0),
        Case(1, "Bouchon 2", "B2", "#800000", "#000000", 1.5),
        Case(2, "Bouchon 3", "B3", "#000080", "#FFFFFF", 3.0),
        Case(3, "Bouchon 4", "B4", "#808000", "#000000", 7.0),
        Case(4, "Bouchon 5 qui est long et cher", "B5",  "#008080", "#FFFFFF", 15.0)
    )
    enregistrerCommande() {
        //Of course, the property nombre of the Cases have changed before this function is called, but here is not the problem. In the Log, I have the good values and next the wrong one.
        Log.i("REGCOM", "avant : $cases")
        AsyncTask.execute {
            val bdd = Room.databaseBuilder(context!!, MaBdd::class.java, "historique").build()
            val dao = bdd.historiqueDao()
            Log.i("REGCOM", "après : ${cases[0]}")
            for (i in cases) dao.insertAll(Historique(0L, i!!.nombre, false))
            idProchainAchat ++
            context!!.getSharedPreferences("all", Context.MODE_PRIVATE).edit().putLong("idProchainAchat", idProchainAchat).apply()
            bdd.close()
        }
        cases.forEach{it.nombre = 0}
        prixCommande = 0.0
    }
}

它应该在我的db Historique数据库中注册属性nombre的值,但始终会注册5次0。

谢谢您的帮助!

对不起,我英语不好,我说法语。

1 个答案:

答案 0 :(得分:0)

我刚刚找到了一个解决方案,也许不是最好的,但是它可行。

list_val

解决方案是“保存” Map中的数据(我使用了Map,因为我只需要两个值,但是只要您使用此方法即可使用List(它不适用于指针)(以为您在编写any()时创建了另一个列表,但是在对象Case上具有相同的指针。我认为是因为我的先例试验。))。我使用了anko的doAsync函数来减少代码量,但是fun enregistrerCommande() { val temp = mutableMapOf<Long, Int>() cases.forEach { temp[it.id] = it.nombre } doAsync { val bdd = Room.databaseBuilder(context!!, MaBdd::class.java, "historique").build() val dao = bdd.historiqueDao() for ((clef, valeur) in temp) dao.insertAll(Historique(0L, clef, valeur, false)) idProchainAchat ++ context!!.getSharedPreferences("all", Context.MODE_PRIVATE).edit().putLong("idProchainAchat", idProchainAchat).apply() bdd.close() } cases.forEach{it.nombre = 0} prixCommande = 0.0 } 也可以工作。

尽管英语不好,但我希望有人能够使用我的答案。