【问题标题】:Should we call the super class before or after we execute some code我们应该在执行某些代码之前还是之后调用超类
【发布时间】:2014-04-01 05:13:21
【问题描述】:
Android Studio 0.4.6

你好,

我这里有一个代码 sn-p。我经常混淆 super 应该是执行的第一行还是最后一行。通常,我将其作为第一个调用,以便可以在父类中设置默认属性。但是,我之前正在查看一些执行此操作的代码。我只是想知道这有什么不同吗?

  @Override
    protected void onDestroy() {
        mBroadCastMgr.unregisterReceiver(receiver); 
        super.onDestroy();
    }

【问题讨论】:

标签: android


【解决方案1】:

如文档中所述:

onDestroy() = 在销毁活动之前调用此回调 由系统决定。

示例插图:

/** Called just before the activity is destroyed. */
   @Override
   public void onDestroy() {
      super.onDestroy();
      Log.d(msg, "The onDestroy() event");
   }

用户@Cristian 经常提到(不知道在哪里)-

这真的取决于你想在你的 onDestroy 中做什么。这就是super.onDestroy 所做的(按此顺序):

1) 关闭 Activity 管理的所有对话框。

2) 关闭活动正在管理的所有游标。

3) 关闭所有打开的搜索对话框。

话虽如此,

“如果你放在 onDestroy 里面的逻辑与那些有关 android做的三件事,那么你可能不得不担心 命令。否则,在大多数情况下,这并不重要。”

【讨论】:

【解决方案2】:

一般来说,当您创建某些内容时,您的代码会在最后执行,而当您销毁某些内容时,您的代码会先执行。就像在现实生活中想象在现有的东西上添加一些东西并从现有的东西中删除一些东西

onDestroy 中,当然,将您的代码放在第一位,super.onDestory 之后的活动无效

onSaveInstanceState 中的另一个有趣的情况是,您应该首先放置您的代码,因为实际保存的是 super.onSaveInstanceState(因此您首先添加了您想要保存的额外内容)

【讨论】:

  • 这并不完全正确。也许您想覆盖子类中父类的某种行为
  • 只有当我们知道 super.onDestroy 做了什么而我们通常不知道或不想知道时,您的论点才有效。通常我们会做一些与标准销毁过程无关的事情,所以我们希望基础过程最后走,这样就好像什么都没发生过一样
【解决方案3】:

如果你想安全地实现清理逻辑,你可以使用下一个模式:

@Override
protected void onDestroy() {
    try {
        mBroadCastMgr.unregisterReceiver(receiver);
    } finally {
        super.onDestroy();
    }
}

一般来说,应该使用文档(方法 javadoc)或超类的源代码在所有被覆盖的方法中检查超类调用的必要性。

【讨论】:

  • try catch 块在这里有什么好处?
  • 如果自定义清理逻辑因异常而失败,super.onDestroy() 无论如何都会被调用。
【解决方案4】:

您应该在before 之前调用它,因为否则超类可能会覆盖您的某些修改。意思是如果你之前调用过它,你的修改是最后一个并且会被采纳。

【讨论】:

  • 调用 setTheme() 应该在 super.onCreate 之前完成,否则不会应用。
【解决方案5】:

如果派生类方法是创建/更新对象信息,那么最好是第一行。

如果您正在释放/释放对象,那么在最终使用时:

@Override
protected void onInit() {
    super.onInit();
}

【讨论】:

    【解决方案6】:

    正如@ReeCube 已经建议的那样,通常您希望在执行代码之前调用超级实现,以确保覆盖超级实现而不是相反。 但我能想到至少有一个例外,你应该在你的之后调用超级实现。想象一下,您正在构建对象。自然,您想从超级实现开始,然后是您的。构造当然有对称操作,即破坏对象。你确实想先销毁你的烂摊子然后调用你的父类来处理它自己创建的其余部分是合乎逻辑的(递归方法),所以当你销毁对象时,你应该首先执行你的代码并调用 之后的超类实现。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-02-25
      • 2022-11-15
      • 1970-01-01
      • 2019-10-20
      • 1970-01-01
      • 1970-01-01
      • 2011-07-04
      • 1970-01-01
      相关资源
      最近更新 更多