我正在阅读安东尼·里兹克(Anthony Rizk)的书《初学者黑莓开发》,他提到虽然 System.exit()
方法可以退出应用程序,但建议避免使用该方法,在退出时通过关闭所有屏幕来正确清理应用程序。我的问题是,为什么要避免使用 System.exit()
?
我正在阅读安东尼·里兹克(Anthony Rizk)的书《初学者黑莓开发》,他提到虽然 System.exit()
方法可以退出应用程序,但建议避免使用该方法,在退出时通过关闭所有屏幕来正确清理应用程序。我的问题是,为什么要避免使用 System.exit()
?
这是一个非常有趣的问题!
System.exit()
在Java SE API和BB Java API中的行为有所不同:
此外,请查看Carol Hamer和Andrew Davison的“Learn Blackberry Games Development”中对此的解释:
注意: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所说的“之前运行的残留物(例如仍然在内存中的静态变量和其他数据)可能会影响应用程序的后续运行”,我并不清楚他们的意思。
这是因为它可能会破坏你自己的有序退出方法,例如清空缓冲输出流/写入器、注销会话、删除文件、提交数据库事务等。
从我对BB开发的记忆中,System.exit()只是关闭应用程序而不会销毁您创建的对象,这些对象将留给垃圾收集器。因此,该应用程序实际上不会从内存中有效地删除。逐个关闭屏幕实际上会释放它们。
我可能在细节上有点偏差,但网络上有足够的关于最佳实践的信息 :)
Object
没有finalize()
,因此无法编写代码来测试这一点。 - Vit Khudenko