我正在研究一款遊戲,當應用程序失去焦點時需要一些時間來重新加載其紋理。在此期間,該應用程序對用戶無響應。在Android GL環境重新加載時顯示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完全接管?也許更重要的是,爲什麼它從鎖定屏幕返回或運行應用程序列表時,而不是當點擊應用程序圖標時執行此操作?