2011-04-12 52 views
1

使用Microsft Exchange時,Android會激活密碼屏幕,用戶需要在每次打開設備時都要通過密碼屏幕。啓用設備密碼屏幕時遊戲崩潰

我正在製作一個使用由線程運行的SurfaceView的遊戲。我正在使用很多靜態變量。如果設備在播放過程中被關閉,當我回來並輸入密碼時,遊戲屏幕會顯示一些位圖大小不正確的圖像並被凍結。

在日誌中,我看到第一個NullPointerException與非UI線程,然後ANR錯誤。它看起來像關閉設備已經銷燬了我的應用程序的一些對象,但它沒有再次通過onCreate和SurfaceView構造函數。

當通過電話或單擊HOME按鈕暫停遊戲時,我沒有任何問題。另外在其他兩種設備上,遊戲在遊戲中途關閉和打開後仍能正常工作,但它們沒有安全屏幕。

我使用的Galaxy Tab,OS 2.2

編輯: 後在線程中打印堆棧跟蹤,我得到

android.graphics.Canvas.throwIfRecycled

似乎我的一些位圖已被回收。任何想法如何在onResume或surfaceChanged()中檢測到這一點,它總是在返回到應用程序時觸發?

+0

堆棧跟蹤真的會有所幫助。您的遊戲在通電時是否重新啓動?你是否將任何數據保存到db/file/preferences? – 2011-04-12 15:35:28

+0

發佈您在日誌中獲得的內容,以便我們找到某些內容 – 2011-04-12 15:37:45

回答

0

目前,我對這個問題的解決方案是關閉這個活動,如果它沒有恢復正確的事件序列。如果onSurfaceChanged發生而沒有onSurfaceCreated先發生,則關閉此活動。遊戲的狀態仍然可以保留,當玩家重新開始這個活動時,它會繼續停止。

@Override 
    public void surfaceChanged(SurfaceHolder holder, int format, int width, 
      int height) { 

     //if it does not start through surfaceCreated close activity 
     // because some bitmaps could be recycled and crash the application 
     if (!surfaceCreatedFirst){ 
      _thread.setRunning(false); //stop the thread 
      ((Activity) context1).finish(); //close activity 
     } 

    } 

    @Override 
    public void surfaceCreated(SurfaceHolder holder) { 
     surfaceCreatedFirst = true; 
     _thread = new FootballThread(holder, this); 
     _thread.setRunning(true); 
     _thread.start(); 
    }