我在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处于特定长度时,这些数据将POST到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中使用?

谢谢,
亚当

最佳答案

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

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

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

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

关于android - 数据类.copy()中的新对象,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53192110/

10-10 08:22
查看更多