数据类.copy()中的新对象

时间:2018-11-07 15:03:22

标签: android kotlin

我在Kotlin中有一个数据类:

data class myDataClass(
    var a: ArrayList<Long> = ArrayList(),
    var b: ArrayList<Long> = ArrayList(),
    var c: ArrayList<Long> = ArrayList(),
    ...
)

private val myDataClassVal: myDataClass = myDataClass()

我使用此数据类存储通过BLE获取的数据,当每个ArrayList具有一定长度时,该数据将发布到REST API。在此POST之后,myDataClass中的数据被.clear()处理,并且该过程将重复。

应用程序的BLE部分对时间敏感,每个POST大约需要1秒钟;我的解决方案是异步运行POST函数;而不是在与BLE代码相同的线程上运行。我通过以下方式执行此操作:

GlobalScope.async { 
    uploadData(myDataClassVal) 
}

myDataClassVal.a.clear()
myDataClassVal.b.clear()
myDataClassVal.c.clear()

不幸的是,在myDataClass函数调用之后,我要立即清除async中的数据,实际上是在序列化和POST之前从数据类中清除了该数据。

为了解决此问题,我在上载前创建了myDataClass的副本,并将其传递到async上载函数中。 重复是使用here中所述的.copy()函数创建的:

uploadBuffer = myDataClassVal.copy()
GlobalScope.async {
    uploadData(uploadBuffer)
}
myDataClassVal.a.clear()
....

但是,uploadBuffer仍然完全为空。如果我以相同的方式创建myDataClass的副本并在同一线程上发布:

uploadBuffer = myDataClassVal.copy()
uploadData(uploadBuffer)
myDataClassVal.a.clear()
....

然后就可以了。

所以,我认为我的问题是uploadBuffer只是指向myDataClass的指针。如果是这种情况,我如何创建一个与myDataClass重复的新对象,以在我的async POST中使用?

谢谢, 亚当

2 个答案:

答案 0 :(得分:2)

为什么不为每次新运行都创建一个新实例。您不需要copy函数,只需在启动后创建一个新实例:

GlobalScope.launch {
    uploadData(uploadBuffer)
}
uploadBuffer = new myDataClassVal()

顺便说一句: 您应该以大写字母开头课程,例如MyDataClassVal。请参阅命名约定:https://kotlinlang.org/docs/reference/coding-conventions.html#naming-rulesan

您应该使用launch而不是async,因为您不需要结果,请参见Kotlin Async vs Launch

答案 1 :(得分:1)

如果仅在异步任务完成后才想清除数据,则可以尝试使用await。

 uploadBuffer = myDataClassVal.copy()
 GlobalScope.async {
     uploadData(uploadBuffer)
 }.await()
 myDataClassVal.a.clear() //this will execute after async returns
 ...