我看到的情况很奇怪。
我正在从数据库中读取一些信息,然后打开一个对话框: 伪
val = DBaseManager.readValue(i,POS_ONE);
if(val == 1)
{
Dialog_Test myDialog = new
Dialog_Test (myContext,"",new addListener(),DBaseManager);
myDialog.show();
}
正如您所看到的,我将DBaseManager传递给Dialog,因此它也可以使用它。
然后在那里我使用它:DBaseManager.readValue(k,POS_TWO);
等
现在这种方法有99%的时间可用,但是我在对话框中有一些指向这些行的崩溃日志,并且空指针异常。
对我而言,这表明在某些设备上,我的onPause或OnDestory方法在主活动中被调用,该活动关闭并使DBaseManager为空。这些是1.6,2.2和2.3设备。
所以问题是为什么,以及如何预防?我已经添加了一些空指针检查以防止崩溃,但它仍然远非理想。
更新:在我的设备上至少当我进行屏幕旋转时,活动重新启动并且对话框消失 - 可能是某些对话框仍然存在吗???
答案 0 :(得分:0)
这可能取决于您的Dialog的范围以及您打开它的代码中的位置。除非您明确处理方向更改并覆盖onOrientationChanged,否则默认行为是Activity在方向更改时经历其生命周期。您可能希望执行诸如在Activity级别维护对话框状态(例如将boolean isDialogDisplayed作为类变量添加),然后在onCreate或onResume中检查并重新打开对话框。
就清理DBaseManager对象而言,我遇到了类似的事情。当你不指望它们时,大型物体会被清理干净(仍然有指向这些物体的指针,但它们已被系统以某种方式取消)。我已经在我的应用程序中识别出这些并且更加小心。只有当你的代码可能已经使变量变为空(或使用延迟加载)时,我才会将此对象视为延迟加载,而不是在null时检查和重新加载null。添加一个返回此对象而不是直接访问它的方法,并始终检查null并重新加载(如果是。)
对于这两个问题,您可能希望覆盖此Activity的所有生命周期方法并记录它们。不要忘记在覆盖中调用基类的生命周期方法(即。public void onPause() { super.onPause() ...
等)!