【问题标题】:Android beginner: onDestroy安卓初学者:onDestroy
【发布时间】:2012-10-12 12:36:10
【问题描述】:

在覆盖活动的 ondestroy 时,我应该在 super.onDestroy() 之前还是之后放置命令?

protected void onDestroy() {

    //option 1: callback before or ...

    super.onDestroy();

    //option 2: callback after super.onDestroy();
}

(现在我担心:如果 super.onDestroy 太快,它永远不会到达选项 2。)

【问题讨论】:

标签: android android-lifecycle destroy


【解决方案1】:

任何可能与使用活动资源有关的事情都应该在调用super.onDestroy() 之前进行。后面的代码会到达,但如果需要这些资源可能会导致问题。

【讨论】:

  • 为什么 android 开发人员手册不建议在任何地方这样做:-( 我找了好几个小时的文档...
【解决方案2】:

将您的代码放在super.onDestroy(); 之后,例如:

protected void onDestroy() {
    super.onDestroy();

    // Put code here.

}

覆盖该方法时,您的代码将完成执行。

【讨论】:

  • 我要调用 testActivity.Instance.InfoThatIAmComingBackToTheMainActivityNow()
【解决方案3】:

当你调用 super.onDestroy(); 时会发生这种情况

Android Source

protected void onDestroy() {
    mCalled = true;

    // dismiss any dialogs we are managing.
    if (mManagedDialogs != null) {

        final int numDialogs = mManagedDialogs.size();
        for (int i = 0; i < numDialogs; i++) {
            final Dialog dialog = mManagedDialogs.valueAt(i);
            if (dialog.isShowing()) {
                dialog.dismiss();
            }
        }
    }

    // also dismiss search dialog if showing
    // TODO more generic than just this manager
    SearchManager searchManager = 
        (SearchManager) getSystemService(Context.SEARCH_SERVICE);
    searchManager.stopSearch();

    // close any cursors we are managing.
    int numCursors = mManagedCursors.size();
    for (int i = 0; i < numCursors; i++) {
        ManagedCursor c = mManagedCursors.get(i);
        if (c != null) {
            c.mCursor.close();
        }
    }
}

基本上这意味着在代码之前或之后调用它都没有关系。

【讨论】:

  • 这是否也意味着我不需要为活动的 onDestroy 调用“dismiss()”?我想我记得有泄漏它们的日志,不是吗?在哪些情况下会发生泄漏?
  • Dismiss 仅适用于对话框,与此问题无关,因为对话框与活动的生命周期不同。如果您遇到对话问题,您应该提出一个新问题,以便更好地解决您的问题。
  • 但它与它相关,因为它询问将命令放入其中的位置,并且您已经展示了它的代码。代码似乎有解除对话框机制
  • onDestroy 只关闭托管对话框。如果你随意创建了一个对话框,这个方法是不知道的。
【解决方案4】:

调用 super.onDestroy 不会中断调用线程或类似的东西。无论您将代码放在哪里,在 super.onDestroy 之前或之后,您的代码都会被执行。

super.onDestroy 只会释放框架可能为此活动引用的资源(例如系统对话框和托管游标)

我建议您查看此链接了解更多详情

http://developer.android.com/reference/android/app/Activity.html#onDestroy()

【讨论】:

    【解决方案5】:

    这取决于。如果您希望在super 函数之后应用您的操作,您应该将您的函数放在超级之后。我想你必须先了解super 的用法。比如看看this question

    【讨论】:

      【解决方案6】:

      它将到达选项 2。onDestroy() 实际上并没有销毁对象。在超类的 onDestroy() 运行并返回后,您的实例仍然存在。

      编辑:这是 onDestroy 按顺序执行的操作:

      • 关闭活动正在管理的所有对话框。
      • 关闭活动正在管理的所有游标。
      • 关闭所有打开的搜索对话框

      【讨论】:

      • 即如果设备足够快,则参考或光标甚至可能在使用选项 2 到达之前就消失了?
      猜你喜欢
      • 2012-03-05
      • 1970-01-01
      • 1970-01-01
      • 2012-09-04
      • 1970-01-01
      • 2014-04-03
      • 2018-11-29
      • 2013-07-14
      • 1970-01-01
      相关资源
      最近更新 更多