我正在开发一款游戏,当应用程序失去焦点时,它需要一些时间来重新加载其纹理。在此期间,应用程序对用户没有响应。
我已经设置了一个处理程序来在纹理加载完成时告诉主 Activity 类,这样它就可以隐藏我在用户离开应用程序时启动的 ProgressDialog,如下所示:
@Override
public void onWindowFocusChanged(final boolean hasWindowFocus) {
super.onWindowFocusChanged(hasWindowFocus);
if (hasWindowFocus) {
if (this.windowLocked && this.gamePaused) {
this.gamePaused = false;
Cocos2dxHelper.onResume();
this.mGLSurfaceView.onResume();
}
this.windowLocked = false;
} else {
this.windowLocked = true;
}
}
@Override
protected void onResume() {
super.onResume();
if (!this.windowLocked && this.gamePaused) {
this.gamePaused = false;
Cocos2dxHelper.onResume();
this.mGLSurfaceView.onResume();
}
if (!this.dialogShowing && this.gamePaused) {
displayResumingDialog();
}
}
@Override
protected void onPause() {
super.onPause();
this.gamePaused = true;
Cocos2dxHelper.onPause();
this.mGLSurfaceView.onPause();
}
显示和隐藏对话框的函数如下所示:
static public void displayResumingDialog() {
dialogShowing = true;
resumingDialog = ProgressDialog.show(sContext, "Re-Initializing", "Please Wait...", true);
}
static public void hideResumingDialog() {
if (resumingDialog != null && resumingDialog.isShowing()) {
resumingDialog.dismiss();
dialogShowing = false;
}
}
如果用户通过主页按钮离开应用程序,然后通过打开应用程序抽屉并再次单击图标返回,这绝对可以正常工作。但是,如果他们锁定屏幕并返回,或者按住主页按钮并从正在运行的应用程序列表中返回,则对话框永远不会隐藏。事实上,除了对话框之外的所有内容都停止运行。如果我将对话框设置为在外部触摸时将其关闭,然后将其关闭,则应用程序仍会挂起,直到我按下“返回”按钮。然后在几秒钟后重新加载纹理并开始游戏。
我已经做了相当多的日志记录试图弄清楚。所有的调用似乎都是一样的,除了有时当屏幕被锁定时,onResume 会被调用两次。我认为我的代码说明了这一点。如果我不允许它在屏幕锁定时显示,则代码会毫无问题地运行到最后。随着对话框启动并且屏幕从锁定状态返回,一旦对话框出现,代码就会停止,因此永远不会调用 onSurfaceCreated 并且永远不会加载纹理。正如我所说,它不会恢复,直到我关闭对话框并按下后退按钮。
什么会导致 ProgessDialog 像那样完全接管?也许更重要的是,为什么它在从锁定屏幕或运行应用程序列表返回时会这样做,而不是在单击应用程序图标时?