Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/211.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在重新加载Android GL上下文时显示ProgressDialog_Android_Progressdialog - Fatal编程技术网

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

在重新加载Android GL上下文时显示ProgressDialog,android,progressdialog,Android,Progressdialog,我正在开发一款游戏,当应用程序失去焦点时,需要花费一些时间来重新加载其纹理。在此期间,应用程序对用户没有响应 我已经设置了一个处理程序,在纹理加载完成时告诉主活动类,这样它就可以隐藏当用户离开应用程序时启动的ProgressDialog,如下所示: @Override public void onWindowFocusChanged(final boolean hasWindowFocus) { super.onWindowFocusChanged(hasWindowFocus);

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

我已经设置了一个处理程序,在纹理加载完成时告诉主活动类,这样它就可以隐藏当用户离开应用程序时启动的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;
    }
}
如果用户通过“主页”按钮离开应用程序,然后打开应用程序抽屉并再次单击图标返回,则此操作绝对有效。如果他们锁定屏幕并返回,或者按住home(主页)按钮并从正在运行的应用程序列表返回,则对话框永远不会隐藏。事实上,除了对话框之外,其他一切都停止运行。如果我将对话框设置为在触摸外部时将其关闭,并且我将其关闭,则应用程序仍将挂起,直到我按下“后退”按钮。几秒钟后,纹理被重新加载,游戏开始

我做了大量的日志记录,试图找出答案。所有的调用似乎都是一样的,只是有时候屏幕被锁定时,onResume会被调用两次。我想我的代码解释了这一点。如果我不允许它在屏幕被锁定时显示,代码将毫无问题地运行到底。随着对话框打开,屏幕从锁定状态返回,一旦对话框显示,代码就会停止,因此SurfaceCreated永远不会被调用,纹理也永远不会有机会加载。正如我所说,直到我关闭对话框并按下后退按钮,它才会恢复


什么会导致ProgesDialog像那样完全接管?也许更重要的是,为什么它在从锁定的屏幕或运行的应用程序列表返回时会这样做,而在单击应用程序图标时却不会这样做?

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

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

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

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

resumingDialog.getWindow().addFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE); 
虽然如果用户从锁定的屏幕返回,对话框会锁定UI的其余部分,但至少它在那里。我尝试在异步任务中显示对话框,以便在UI的其余部分被锁定时使其旋转,但没有这样的运气。如果有人能告诉我如何让对话旋转,我很乐意将答案奖励给那个人。如果他们通过运行应用程序列表或应用程序图标返回应用程序,而不是从锁定的屏幕返回,则会旋转