android - 在 Android GL 上下文重新加载时显示 ProgressDialog

标签 android progressdialog

我正在开发一款游戏,当应用程序失去焦点时,它需要一些时间来重新加载其纹理。在此期间,应用对用户无响应。

我设置了一个处理程序来通知主 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 像那样完全接管?也许更重要的是,为什么在从锁定屏幕或正在运行的应用程序列表返回时执行此操作,但在单击应用程序图标时却不执行此操作?

最佳答案

好吧,我不想回答我自己的问题,但我弄清楚了问题并认为它可能对其他人有帮助。 对话框在创建时进入焦点,因此永远不会调用 onWindowFocusChanged 代码,因此永远不会重新加载纹理。我通过使我的对话框不可聚焦来修复它,如下所示:

resumingDialog.getWindow().addFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE); 

虽然如果用户从锁定的屏幕返回,对话框会与 UI 的其余部分一起锁定,但至少它在那里。我尝试在 asynctask 中显示对话框以使其在 UI 的其余部分被锁定时旋转,但没有这样的运气。如果有人能告诉我如何让对话旋转,我很乐意将答案授予那个人。如果他们通过正在运行的应用程序列表或应用程序图标而不是从锁定屏幕返回到应用程序,它就会旋转。

关于android - 在 Android GL 上下文重新加载时显示 ProgressDialog,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18008327/

相关文章:

Android: ScrollView 中的两个图像

android - 加载数据时显示进度对话框

android - 进度对话框样式

android - 如何从Android进行直播

java - 如何在android中获取当前年份?

java - 文件未找到异常? (语音识别)

java - Googlecast,这些jar文件位于哪个jar文件中?

android - 进度条不显示进度条

android - 处理多个 Activity 中的进度对话框

Android:ProgressDialog 没有立即显示