【问题标题】:How to avoid `Activity pause timeout for ActivityRecord` error?如何避免“ActivityRecord 的活动暂停超时”错误?
【发布时间】:2016-03-09 12:23:36
【问题描述】:

方式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

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

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

【问题讨论】:

标签: android android-activity android-activityrecord


【解决方案1】:

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();
}

作为旁注,正如我在 cmets 中所说,the documentation 表示您必须始终首先调用超类方法,但正如@ankit aggarwal 所述,What is the correct order of calling superclass methods in onPause, onStop and onDestroy methods? and Why? 是一个很好的答案,可以解释 WAY2 是否优于WAY1 以及为什么。

【讨论】:

    【解决方案2】:

    如果我使用 WAY2 是否可以避免暂停超时错误?

    不,你不会。

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


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

    对我来说我更喜欢:

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

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

    【讨论】:

    • 我正在清理doSometing 中的相机资源。在某些设备中,Camera#release() 花费太多时间并导致W/ActivityManager( 4347): Activity pause timeout for ActivityRecord。我想知道timeout什么时候开始录制。
    • @JerikcXIONG 仅将doSomething(); 替换为Camera#release(),然后重试。看看这是否是因为 doSomething(); 中的其他代码
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-04-04
    • 1970-01-01
    • 2021-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-20
    相关资源
    最近更新 更多