8

方式1:

@Override
protected void onPause() {
    super.onPause();
    // do something urgent
    doSomething();
}

方式2:

@Override
protected void onPause() {
    // do something urgent
    doSomething();
    super.onPause();
}

区别在于 和 的调用doSomething()顺序super.onPause()。当我使用WAY1时,如果doSomething()成本太多,我会得到错误:W/ActivityManager( 4347): Activity pause timeout for ActivityRecord

pause timeout如果我使用WAY2,我会避免错误吗?

我检查了 AOSP ,但是我很难理解 Activity 的调用过程。

4

2 回答 2

7

文件

您应该保持在 onPause() 方法中完成的操作量相对简单,以便在您的活动实际停止时快速过渡到用户的下一个目的地。

如果您查看ActivityStack用于“单个活动堆栈的状态和管理”的类,它定义

// How long we wait until giving up on the last activity to pause.  This
// is short because it directly impacts the responsiveness of starting the
// next activity.
static final int PAUSE_TIMEOUT = 500;

因此,如果 执行的操作onPause()超过此超时,您将收到消息Activity pause timeout

由于这个超时是为Activity的暂停设置的,onPause()只是一个回调方法,允许你在Activity暂停时执行操作,所以改变顺序(WAY1或WAY2)不会影响超时(在WAY1和WAY2都会触发)方式2)。为了证明这一点,这两个代码都打印了Activity pause timeout消息:

// WAY1
@Override
protected void onPause() {
    super.onPause();

    try {
        Thread.sleep(501); // Don't do this!!! Only for testing purposes!!!
    }catch (Exception e) {
    }
}

// WAY2
@Override
protected void onPause() {
    try {
        Thread.sleep(501); // Don't do this!!! Only for testing purposes!!!
    }catch (Exception e) {
    }

    super.onPause();
}

作为旁注,正如我在评论中所说,文档说您必须始终首先调用超类方法,但正如@ankit aggarwal 所述,在 onPause、onStop 和 onDestroy 方法中调用超类方法的正确顺序是什么?为什么?是一个很好的答案,解释了 WAY2 是否优于 WAY1 以及为什么。

于 2016-03-09T14:53:49.383 回答
0

如果我使用 WAY2,我会避免暂停超时错误吗?

不,你不会。

你在doSomething();方法上做什么?清洁不应该花那么多时间。
如果您通过互联网发送数据或将数据保存到数据库?将此代码移动到 aService/IntentService或 a Thread


先打电话super.xxx()还是myMethod()先打电话?

对我来说,我更喜欢:

  • 在启动方法中调用super.xxx() FIRSTonCreate() / onStart() / onResume()
  • 在停止方法中调用super.xxx() LASTonPause() / onStop() / onDestroy()

使用这种方法,您可以维护调用堆栈,在使用之前Android初始化 Activity (例如)中的所有内容。并且您在Android开始清理之前清理了变量Activity

于 2016-03-09T13:05:27.953 回答