【发布时间】:2018-11-08 00:43:59
【问题描述】:
我在 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()ed,并且该过程将重复。
应用程序的 BLE 部分对时间敏感,每个 POST 大约需要 1 秒;我对此的解决方案是异步运行我的 POST 函数;而不是在与 BLE 代码相同的线程上运行。我通过以下方式做到这一点:
GlobalScope.async {
uploadData(myDataClassVal)
}
myDataClassVal.a.clear()
myDataClassVal.b.clear()
myDataClassVal.c.clear()
不幸的是,我在myDataClass 函数调用之后立即清除myDataClass 中的数据,实际上在序列化和发布之前从数据类中清除了数据。
为了解决这个问题,我在上传之前创建了myDataClass 的副本,并将其传递给async 上传函数。 duplicate 是使用.copy() 函数创建的,如here 所述:
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 中使用?
谢谢, 亚当
【问题讨论】:
-
如果您只使用不可变数据,就不会遇到这些问题。不,它不会创建深层副本,因此对 object1 的更改也会在副本上更改
-
@s1m0nw1 你能详细说明一下吗?
-
好吧,让你的属性
var a: List<Long>并且不要暴露可变版本的 List。通过这种方式,您可以确保一旦您从班级获得列表,之后就不会更改。而不是添加到您的列表中,您将重新分配列表;而不是清除,您将重新分配给一个空列表等