我在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中使用?
谢谢, 亚当
答案 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
...