2013-08-02 38 views
1

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

回答

1

嗯,我討厭回答我自己的問題,但我找到了問題,並認爲它可能會幫助別人。 該對話框在創建時進入焦點,因此onWindowFocusChanged代碼永遠不會被調用,所以紋理永遠不會重新加載。我固定它通過使我的對話框不可作爲焦點,就像這樣:

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

雖然對話框鎖定了該UI的其餘部分,如果從鎖定屏幕的用戶的回報,至少它的存在。我嘗試在asynctask中顯示對話框,以便在UI的其他部分被鎖定時使其旋轉,但沒有這樣的運氣。如果有人能告訴我如何讓對話旋轉,我很樂意將答案給予該人。如果它們通過正在運行的應用程序列表或應用程序的圖標返回到應用程序,則不會從鎖定的屏幕返回。

相關問題