Jer*_*ONG 7 android android-activity android-activityrecord
WAY1:
@Override
protected void onPause() {
super.onPause();
// do something urgent
doSomething();
}
Run Code Online (Sandbox Code Playgroud)
WAY2:
@Override
protected void onPause() {
// do something urgent
doSomething();
super.onPause();
}
Run Code Online (Sandbox Code Playgroud)
所不同的是调用顺序doSomething()和super.onPause().当我使用WAY1时,如果doSomething()成本太高,我会得到错误:W/ActivityManager( 4347): Activity pause timeout for ActivityRecord.
pause timeout如果我使用WAY2,我会避免错误吗?
我检查了AOSP,但是我很难理解Activity的调用过程.
文档说
您应该保持在 onPause() 方法中完成的操作量相对简单,以便在您的 Activity 实际停止时快速过渡到用户的下一个目的地。
如果您查看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;
Run Code Online (Sandbox Code Playgroud)
因此,如果执行的操作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();
}
Run Code Online (Sandbox Code Playgroud)
作为旁注,正如我在评论中所说,文档说您必须始终首先调用超类方法,但正如@ankit aggarwal 所述,在 onPause、onStop 和 onDestroy 方法中调用超类方法的正确顺序是什么?为什么?是一个很好的答案,解释了 WAY2 是否比 WAY1 更好以及为什么。