【问题标题】:Difference between code before and after super()super() 前后代码的区别
【发布时间】:2011-11-03 16:51:04
【问题描述】:

看看下面的示例代码

@Override
protected void onPause() {
    ...some code here...
    super.onPause();
}

@Override
protected void onPause() {
    super.onPause();
    ...some code here...
}

当我问及代码的差异时,我并不是指执行流程,这是显而易见的。

那么这些代码之间的真正区别是什么?建议什么时候使用您的代码之前 super() 调用,以及何时使用您的代码之后 super() 调用?我想在某些情况下这确实很重要。

【问题讨论】:

  • @Tim:这仅在构造函数中是正确的
  • 是的,刚刚测试过了。你是对的,我把两者搞混了。

标签: java android oop


【解决方案1】:

您不应将任何代码放在super.onPause() 之前,因为此方法可以让系统执行正确暂停应用程序所需的操作。您要在onPause() 回调中执行的任何代码都应放在对super.onPause() 的调用之后。希望这会有所帮助。

引用Activities

注意:这些生命周期方法的实现必须始终在执行任何工作之前调用超类实现,如上面的示例所示。

【讨论】:

  • 是的,我想您会发现首先调用 super 也遵循 OO pragma,因为您希望在做独特的事情之前先做继承的类的事情。
  • 日志呢?除了记录之外,我们都遵循该模式,即我们总是在超级调用之前有一个 Log.d 跟踪。
  • 我更喜欢 Android 的 LIFO,onPause 是我最后一次调用 super.onPause 的传出事件
【解决方案2】:

必须通过此链接插入主题相同的线程:

super.onResume() at beginning or end of method? Does it matter?

请注意 Dianne Hackborn 的引述

是的,这是一个很好的模式。在大多数情况下,这可能无关紧要,但是 这是一般规则:在任何类型的初始化期间,让超类 先做他们的工作;在任何类型的最终确定期间,您都会完成您的工作 首先。

【讨论】:

  • 我认为Dianne的报价可以看作是一个规则。毕竟她是安卓工程师团队的一员吧?!
  • 没错。似乎我们从 Android 团队本身得到了相互矛盾的建议。因为它“可能无关紧要”,所以我将保留我的代码。如果它没有坏,我不会修复它。
【解决方案3】:

在我的代码之前调用super 方法我从来没有遇到任何问题,我很确定如果我在我的代码之后调用super 方法我不会遇到任何问题。但通常超类实例必须在子类之前初始化并在子类之后取消初始化。因此,理想情况下,您应该在调用 onCreate()onStart()onRestart()onResume() 中的 super 之后以及在 onPause()onStop()onDestroy() 之前运行您的代码。

但是再来一次。所有这些代码都在 UI 线程上执行,因此除了一些极少数情况外,您的代码顺序没有多大意义。但最好的办法是阅读源代码并了解其工作原理以及实际发生的情况。

【讨论】:

  • 这就是我一直在做的事情(超级最后在暂停,首先在恢复等),认为我想做一些事情,比如取消计时器等,在超级真正暂停/停止之前/破坏。然而 Egor 的引用是正确的,所以这让我现在很担心。
猜你喜欢
  • 1970-01-01
  • 2019-04-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-09
  • 2019-06-07
  • 1970-01-01
  • 2019-03-16
相关资源
最近更新 更多