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

Android 如何避免“ActivityRecord的活动暂停超时”错误?,android,android-activity,android-activityrecord,Android,Android Activity,Android Activityrecord,方式1: 方式2: 区别在于doSomething()和super.onPause()的调用顺序。当我使用方法1时,如果doSomething()成本太高,我将得到错误:W/ActivityManager(4347):ActivityRecord的活动暂停超时 如果使用方式2,是否避免了暂停超时错误 我检查了AOSP,但是我很难理解活动的调用过程 如果使用WAY2,是否可以避免暂停超时错误 不,你不会的 你在doSomething()中做什么方法?清洁不应该花那么多时间。 如果您通过intern

方式1:

方式2:

区别在于
doSomething()
super.onPause()
的调用顺序。当我使用方法1时,如果
doSomething()
成本太高,我将得到错误:
W/ActivityManager(4347):ActivityRecord的活动暂停超时

如果使用方式2,是否避免了暂停超时错误

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

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

不,你不会的

你在
doSomething()中做什么方法?清洁不应该花那么多时间。
如果您通过internet发送数据或将数据保存到DB?将此代码移动到
服务/IntentService
线程


先调用
super.xxx()
first还是先调用
myMethod()
first

对我来说我更喜欢:

  • 在启动方法
    onCreate()/onStart()/onResume()
  • 在停止方法中调用super.xxx()
LAST 使用这种方法,您可以维护调用堆栈,
Android
在使用之前初始化活动中的所有内容(例如)。在
Android
开始清理
活动之前,您清理了变量

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

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

@Override
protected void onPause() {
    // do something urgent
    doSomething();
    super.onPause();
}
因此,如果
onPause()
执行的操作超过此超时,您将收到消息
Activity pause timeout

由于此超时是为暂停活动而设置的,
onPause()
只是一种回调方法,允许您在活动暂停时执行操作,因此更改顺序(WAY1或WAY2)不会影响超时(它将在WAY1和WAY2中触发)。为了证明这一点,这两个代码都打印了
活动暂停超时
消息:

// 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;

作为旁注,正如我在评论中所说,您必须始终首先调用超类方法,但正如@ankit aggarwal所述,这是一个非常好的答案,可以解释WAY2是否优于WAY1以及原因。

根据我的说法,您必须始终调用超类方法first@antonio对我看到了。你知道原因吗?并将正确地向您解释清理
剂量测量中的相机资源所需的所有知识。在某些设备中,
Camera#release()
花费了太多时间,并导致
W/ActivityManager(4347):ActivityRecord的活动暂停超时。我想知道何时开始录制
超时
@JerikcXIONG replace
doSomething()Camera#release()
编码>并重试。查看这是否是由于
doSomething()中的其他代码造成的
// 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;
// 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();
}