我在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/