如何避免“ActivityRecord”的“活动暂停超时”错误?

时间:2016-03-09 12:23:36

标签: android android-activity android-activityrecord

WAY1:

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

WAY2:

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

区别在于doSomething()super.onPause()的调用序列。当我使用 WAY1 时,如果doSomething()花费太多,我将收到错误:W/ActivityManager( 4347): Activity pause timeout for ActivityRecord

如果我使用 WAY2 ,我是否可以避免pause timeout错误?

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

2 个答案:

答案 0 :(得分:4)

The documentation

  

您应该在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中触发。为了证明这一点,这两个代码都打印了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();
}

作为旁注,正如我在评论中所说,the documentation说你必须首先调用超类方法,但正如@ankit aggarwal所述,What is the correct order of calling superclass methods in onPause, onStop and onDestroy methods? and Why?是一个非常好的答案,解释是否WAY2比WAY1好,为什么。

答案 1 :(得分:0)

  

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

不,你不会。

您在doSomething();方法中做了什么?清洁不应该花费那么多时间 如果您通过互联网发送数据或将数据保存到数据库?将此代码移至Service/IntentServiceThread

先是super.xxx()还是先myMethod()

对我来说我更喜欢:

  • 在启动方法super.xxx()
  • 中致电onCreate() / onStart() / onResume() 第一
  • 在停止方法super.xxx()
  • 时致电onPause() / onStop() / onDestroy() 最后

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

之前清理了变量