【发布时间】:2011-11-29 01:03:09
【问题描述】:
我在 Anthony Rizk 的《开始 BlackBerry 开发》一书中读到,虽然 System.exit() 方法会退出应用程序,但建议避免这种情况,并在退出时通过关闭所有屏幕来正确清理应用程序。我的问题是,为什么要避免System.exit()?
【问题讨论】:
标签: java blackberry java-me
我在 Anthony Rizk 的《开始 BlackBerry 开发》一书中读到,虽然 System.exit() 方法会退出应用程序,但建议避免这种情况,并在退出时通过关闭所有屏幕来正确清理应用程序。我的问题是,为什么要避免System.exit()?
【问题讨论】:
标签: java blackberry java-me
这是一个非常有趣的问题!
Java SE API 和 BB Java API 的 System.exit() 行为有所不同:
还可以查看 Carol Hamer 和 Andrew Davison 在“学习黑莓游戏开发”中的相关内容:
注意:BlackBerry 平台不会在单独的虚拟环境中启动您的应用程序 机器,这意味着您必须非常小心清理。一个残骸 较早的运行(例如静态变量和其他仍在内存中的数据)可能会影响应用程序的后续运行。这也意味着有一个全局命名空间,所以如果两个类具有相同的名称,就会出现错误。
所以,是的,每个 BB 设备只有一个 JVM。是的,在 BB 应用程序中,System.exit() 调用只会停止您的应用程序,将所有静态数据留在 RAM 中,除非您进行初步清理。
所以你不应该避免 System.exit() - 这是关闭 BB 应用程序的合法/适当方式,但在此调用之前进行任何清理。
更新:
哎呀。我创建了一个测试应用程序(使用 JDE 4.7.0 + Storm 9530 4.7.0 模拟器)来测试 System.exit() 调用后静态内容是否真的保留在 RAM 中。事实证明,它不再留在那里了。下次我进入应用程序时,静态变量为空(正如我们期望它们在 Java SE 中一样)。所以我不清楚 Carol Hamer 和 Andrew Davison 的意思是说“早期运行的剩余部分(例如静态变量和其他仍在内存中的数据)可能会影响应用程序的后续运行”。
【讨论】:
这是因为它可能会使您自己的有序退出方法短路,例如刷新缓冲的输出流/写入器,注销会话,删除文件,提交 DBMS 事务,...
【讨论】:
据我了解,通过调用 System.exit() 来终止容器是不正确的。这样做的正确方法是创建某种类型的 destroy() 方法,该方法允许清理您的线程并关闭您打开的任何资源。
通俗地说,System.exit() 可能会留下挥之不去的数据/会话信息。
【讨论】:
根据我对 BB 开发的记忆,System.exit() 只是关闭应用程序而不破坏您创建的对象,将它们留给垃圾收集器。因此,该应用程序不会有效地从内存中删除。一个一个地关闭屏幕实际上会释放它们。
我可能不太了解细节,但网上已经有足够多的关于最佳实践的信息了 :)
【讨论】:
System.exit() 退出的JVM。这就是我的评论所针对的。你的答案仍然不正确。
System.exit() 不会终止 JVM,只会终止应用程序。每个 BB 设备只有一个 JVM。所有应用都在唯一的 JVM 中运行。