Android:在对话框中关闭活动

时间:2011-01-14 15:37:16

标签: android dialog android-activity

我看到的情况很奇怪。

我正在从数据库中读取一些信息,然后打开一个对话框: 伪

 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设备。

所以问题是为什么,以及如何预防?我已经添加了一些空指针检查以防止崩溃,但它仍然远非理想。

更新:在我的设备上至少当我进行屏幕旋转时,活动重新启动并且对话框消失 - 可能是某些对话框仍然存在吗???

1 个答案:

答案 0 :(得分:0)

这可能取决于您的Dialog的范围以及您打开它的代码中的位置。除非您明确处理方向更改并覆盖onOrientationChanged,否则默认行为是Activity在方向更改时经历其生命周期。您可能希望执行诸如在Activity级别维护对话框状态(例如将boolean isDialogDisplayed作为类变量添加),然后在onCreate或onResume中检查并重新打开对话框。

就清理DBaseManager对象而言,我遇到了类似的事情。当你不指望它们时,大型物体会被清理干净(仍然有指向这些物体的指针,但它们已被系统以某种方式取消)。我已经在我的应用程序中识别出这些并且更加小心。只有当你的代码可能已经使变量变为空(或使用延迟加载)时,我才会将此对象视为延迟加载,而不是在null时检查和重新加载null。添加一个返回此对象而不是直接访问它的方法,并始终检查null并重新加载(如果是。)

对于这两个问题,您可能希望覆盖此Activity的所有生命周期方法并记录它们。不要忘记在覆盖中调用基类的生命周期方法(即。public void onPause() { super.onPause() ...等)!