2011-01-14 175 views
0

我看到一种奇怪的情况。Android:在对话框中关闭活动

我读从数据库的一些信息,然后将弹出一个对话框: 伪

val = DBaseManager.readValue(i,POS_ONE); 

if(val == 1) 
{ 
    Dialog_Test myDialog = new 
    Dialog_Test (myContext,"",new addListener(),DBaseManager); 
    myDialog.show(); 
} 

,你可以看到我传递到对话框中DBaseManager所以它也可以使用它。

然后在那里我用这样的:

DBaseManager.readValue(k,POS_TWO); 

现在这个工程的99%的时间,但是我有一些指向这些行对话框,在崩溃日志空指针异常。

对我来说,这表明在某些设备上,我的onPause或OnDestory方法在主要活动中被调用,该活动会关闭并消除DBaseManager。这些是1.6,2.2和2.3的设备。

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

UPDATE:在我的设备上,至少当我做一个屏幕旋转活动重新启动,对话框消失 - 它可能会在一些对话框上保持?

回答

0

这可能取决于您的对话框的范围以及您打开它的代码的位置。除非您明确处理方向更改并覆盖onOrientationChanged,否则默认行为是在方向更改时,活动会经历其生命周期。你可能想要做一些事情,比如在Activity级别维护对话的状态(比如添加一个布尔isDialogDisplayed作为类变量),然后在onCreate或onResume中检查并重新打开对话框。

至于清理DBaseManager对象,我遇到过类似的事情。当你不指望它们的时候,大的对象被清理干净(仍然有指向这些对象的指针,但它们已被系统以某种方式清空)。我在我的应用程序中确定了这些内容,并且更加小心。当只有当你的代码可能已经清空了变量(或者使用延迟加载)时,而不是null检查和重新加载时,我总是把这个对象当作懒惰加载。添加一个返回此对象而不是直接访问它的方法,并且始终检查是否为null,如果是,则重新加载。

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

+0

谢谢,我认为这是清理大物体的第二种情况。我已经覆盖了所有内容,但无法重现它只发生在现场。我想我会创建一个util例程,按照建议重新打开它。 – Chris 2011-01-14 16:21:27