【问题标题】:Android: Activity closing when in dialogAndroid:在对话框中关闭活动
【发布时间】:2011-01-14 15:37:16
【问题描述】:

我遇到了一个奇怪的情况。

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

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

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

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

【问题讨论】:

    标签: android dialog android-activity


    【解决方案1】:

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

    至于被清理的 DBaseManager 对象,我也经历过类似的事情。大型对象在您不希望它们清理时被清理(仍然有指向这些对象的指针,但它们已被系统以某种方式清空)。我已经在我的应用程序中确定了这些并且更加小心。仅当您的代码可能使变量为空(或使用延迟加载)时,我不会在 null 时检查和重新加载,我总是将此对象视为延迟加载。添加一个返回此对象而不是直接访问它的方法,并始终检查 null 并重新加载。

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

    【讨论】:

    • 谢谢,我认为这是清理大对象的第二种情况。我已经覆盖了所有内容,但无法重现它只发生在现场。我想我会创建一个实用程序,按照建议通过重新打开来获取它。
    • 同样的事情......我从该领域得到错误报告,这些报告我无法重现,也从未在我自己的测试中看到过完全相同类型的行为。乱七八糟的东西。大声笑
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-19
    • 2012-11-14
    • 1970-01-01
    • 2022-01-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多