Kotlin:为什么 Array 和 ArrayList 在重新运行之前没有清空?
Kotlin: Why Array and ArrayList are not emptied before a rerun?
我的科学应用程序是完全动态的,只有一个 activity,没有片段或意图。
在某些情况下,我需要完全完成应用程序。
所以我运行
(this as Activity).finishAndRemoveTask()
自 Lollipop (Android 5.0), version 21
以来运行顺畅。
显然,内存中没有任何应用程序痕迹或服务。
但是,我发现了一个大问题。
我有一些全局数组或数组列表(我没有看到其他变量)。
新的 re运行 仍然完好无损,即使我有一个声明
清空那个变量。通过调试器使用 re运行 不会发生这种情况,
应该是来自 phone.
单元格的新 re运行
下面我展示了一个示意图示例。我在一个 .kt 文件中声明,在任何 class 或函数之外。
class DispFu(
var id: Int = 0,
var isKeyl:Boolean=false,
}
var vDispFu = arrayListOf<DispFu>()
之后,我在 onCreate 处理中填充 vDispFu
并达到 134 个项目。
为了证明这一点,在退出程序之前,我在 activity onCreate 处理中在我的 phone 上记录了一个文件。
fun now():String{
var hora = LocalTime.now()
return "${hora.hour}:${hora.minute}:${hora.second}"
}
var fileDep:File = createOrGetFile(Environment.getExternalStoragePublicDirectory
(Environment.DIRECTORY_DOWNLOADS),"DepCalc","") // File for debugging
fileDep.appendText("${now()} -> vDispFu size is ${vDispFu.size}\n")
下面有2个运行:第一个运行(内部调试器)和一个独立的re运行。这是文件内容:
11:3:2 -> vDispFu size is 0
11:3:18 -> vDispFu size is 134
我知道 global variables
不推荐,但我只是想了解发生了什么。这对我来说没有意义。
如果有人能给我一些关于正在发生的事情的线索并给我一些替代策略,那就太好了!
显然,出于实际原因,解决方案不能涉及完全重新制定程序,该程序有将近 4 万行...
我已经解决了我的问题:
有时,令人难以置信的是,将问题外化的努力有时有助于解决问题....
完全退出应用程序的以下步骤:
(this as Activity).finishAndRemoveTask()
这还不够,尽管 Stack Overflow
上所有关于它的帖子都提倡这种策略。
必须包含其他命令:
(this as Activity).finishAndRemoveTask()
System.exit(0)
现在:
11:26:25 -> vDispFu size is 0
11:27:1 -> vDispFu size is 0
完成 Activity 不会关闭整个应用程序或 VM,因此所有全局变量会继续保留在内存中。当您使用调试器重新运行您的应用程序时,它实际上会重新启动 VM,这就是您看到它在这种情况下被清除的原因。
System.exit()
不是理想的解决方案,因为它会重新启动您的 VM 进程。这样做会有额外的流失。它实际上是为异常的不可恢复的错误而设计的。在您的特定情况下不一定是问题。
更恰当的处理方法是将 top-level 数据放入单例中,并在完成 Activity.
时手动清除它
我的科学应用程序是完全动态的,只有一个 activity,没有片段或意图。
在某些情况下,我需要完全完成应用程序。
所以我运行
(this as Activity).finishAndRemoveTask()
自 Lollipop (Android 5.0), version 21
以来运行顺畅。
显然,内存中没有任何应用程序痕迹或服务。
但是,我发现了一个大问题。
我有一些全局数组或数组列表(我没有看到其他变量)。 新的 re运行 仍然完好无损,即使我有一个声明 清空那个变量。通过调试器使用 re运行 不会发生这种情况, 应该是来自 phone.
单元格的新 re运行下面我展示了一个示意图示例。我在一个 .kt 文件中声明,在任何 class 或函数之外。
class DispFu(
var id: Int = 0,
var isKeyl:Boolean=false,
}
var vDispFu = arrayListOf<DispFu>()
之后,我在 onCreate 处理中填充 vDispFu
并达到 134 个项目。
为了证明这一点,在退出程序之前,我在 activity onCreate 处理中在我的 phone 上记录了一个文件。
fun now():String{
var hora = LocalTime.now()
return "${hora.hour}:${hora.minute}:${hora.second}"
}
var fileDep:File = createOrGetFile(Environment.getExternalStoragePublicDirectory
(Environment.DIRECTORY_DOWNLOADS),"DepCalc","") // File for debugging
fileDep.appendText("${now()} -> vDispFu size is ${vDispFu.size}\n")
下面有2个运行:第一个运行(内部调试器)和一个独立的re运行。这是文件内容:
11:3:2 -> vDispFu size is 0
11:3:18 -> vDispFu size is 134
我知道 global variables
不推荐,但我只是想了解发生了什么。这对我来说没有意义。
如果有人能给我一些关于正在发生的事情的线索并给我一些替代策略,那就太好了!
显然,出于实际原因,解决方案不能涉及完全重新制定程序,该程序有将近 4 万行...
我已经解决了我的问题:
有时,令人难以置信的是,将问题外化的努力有时有助于解决问题....
完全退出应用程序的以下步骤:
(this as Activity).finishAndRemoveTask()
这还不够,尽管 Stack Overflow
上所有关于它的帖子都提倡这种策略。
必须包含其他命令:
(this as Activity).finishAndRemoveTask()
System.exit(0)
现在:
11:26:25 -> vDispFu size is 0
11:27:1 -> vDispFu size is 0
完成 Activity 不会关闭整个应用程序或 VM,因此所有全局变量会继续保留在内存中。当您使用调试器重新运行您的应用程序时,它实际上会重新启动 VM,这就是您看到它在这种情况下被清除的原因。
System.exit()
不是理想的解决方案,因为它会重新启动您的 VM 进程。这样做会有额外的流失。它实际上是为异常的不可恢复的错误而设计的。在您的特定情况下不一定是问题。
更恰当的处理方法是将 top-level 数据放入单例中,并在完成 Activity.
时手动清除它