【问题标题】:New object from data class .copy()来自数据类 .copy() 的新对象
【发布时间】: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&lt;Long&gt; 并且不要暴露可变版本的 List。通过这种方式,您可以确保一旦您从班级获得列表,之后就不会更改。而不是添加到您的列表中,您将重新分配列表;而不是清除,您将重新分配给一个空列表等

标签: android kotlin


【解决方案1】:

为什么不为每次新运行创建一个新实例。您不需要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

【讨论】:

    【解决方案2】:

    如果您只想在异步任务完成后清除数据,您可以尝试使用等待。

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

    【讨论】:

    • 数据需要立即清除,很遗憾!
    • 或者......也许它没有,让我们实验一下
    猜你喜欢
    • 2016-10-26
    • 1970-01-01
    • 2018-04-11
    • 1970-01-01
    • 1970-01-01
    • 2012-02-26
    • 1970-01-01
    • 1970-01-01
    • 2018-09-12
    相关资源
    最近更新 更多