我正在制作一款游戏,当应用程序失去焦点时,需要花费一些时间来重新加载纹理。在此期间,应用程序无法响应用户。
我已经设置了一个处理程序,可以在纹理完成加载时告诉主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完全接管?也许更重要的是,为什么在从锁定的屏幕返回或运行应用程序列表时才这样做,而不是在点击应用程序图标时呢?
答案 0 :(得分:1)
好吧,我讨厌回答我自己的问题,但我发现了问题并认为它可能对其他人有所帮助。 该对话框在创建时会成为焦点,因此onWindowFocusChanged代码永远不会被调用,因此纹理永远不会被重新加载。我通过使对话无法集中来修复它,如下所示:
resumingDialog.getWindow().addFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE);
虽然如果用户从锁定屏幕返回,对话框会与UI的其余部分锁定,但至少它就在那里。我尝试在asynctask中显示对话框以使其旋转,而其他UI被锁定,但没有这样的运气。如果有人能告诉我如何让对话旋转,我很乐意将答案给予那个人。如果他们通过正在运行的应用程序列表或应用程序的图标返回应用程序,它就会旋转,而不是从锁定的屏幕返回。