2011-10-21 46 views
4

當Surfaceview通過接收呼叫或退出並返回到應用程序進入背景時,我的應用程序崩潰。我讀到surfaceexetroyed不接到這些情況的電話,但 給出的解決方案沒有爲我工作。 如果有人可以用我的代碼來幫助我,我會很樂意。 感謝當桌面進入背景時,Surfaceview崩潰

public GameLoopThread(GameView view) 
{ 

this.view=view; 
} 
public void setRunning (boolean run) 
{ 
    running=run; 
} 
@Override 
public void run() { 

    long ticksPerSecond=1000/FPS; 
    long startTime; 
    long sleepTime; 
    while (running) 
    { 
     Canvas c=null; 
     startTime=System.currentTimeMillis(); 
     try { 
     c=view.getHolder().lockCanvas(); 
     synchronized (view.getHolder()) { 
      view.onDraw(c); 
     } 

     } catch (Exception e) { 
      // TODO: handle exception 
     } 
     finally{ 
      if(c!=null) 
      view.getHolder().unlockCanvasAndPost(c); 
     } 
     sleepTime=ticksPerSecond-(System.currentTimeMillis()-startTime); 
     try 
     {if(sleepTime>0) 
      sleep(sleepTime); 
     else 
      sleep(10); 

     } 
     catch(Exception e){} 

     synchronized (mPauseLock) { 
      while (!running) { 
       try { 
        mPauseLock.wait(); 
       } catch (InterruptedException e) { 
       } 
      } 
     } 
    } 

and in the surfaceview: 
public void surfaceDestroyed(SurfaceHolder holder) { 
if(gameLoopThread.isAlive()) 
      { 
       boolean retry = true; 
       gameLoopThread.setRunning(false); 
       while (retry) { 
        try { 
         gameLoopThread.join(); 
         retry = false; 
        } catch (InterruptedException e) { 
        } 
       } 
      } 
      } 

      @Override 
      public void surfaceCreated(SurfaceHolder holder) { 
       if(!gameLoopThread.isAlive()) 
        {   

        gameLoopThread.setRunning(true); 
        gameLoopThread.start(); 

        } 
      } 

也許logcat的幫助:

9月10日至22日:35:06.310:DEBUG /夥伴-------------- --------------->(10985):服務:OnReceive ACTION_HOME_RESUME調用 10-22 09:35:06.315:DEBUG/AndroidRuntime(3275):關閉VM 10-22 09:35 :06315:WARN/dalvikvm(3275):threadid = 1:線程退出與未捕獲的異常(組= 0x4001e578) 10-22 09:35:06.315:錯誤/ AndroidRuntime(3275):致命異常:主 10-22 09:35:06.315:ERROR/AndroidRuntime(3275):java.lang.NullPointerException 10-22 09:35:06.315:ERROR/AndroidRuntime(3275):at tomer.idunku3.GameView $ 1.surfaceDestroyed( GameView.java:126) 9月10日至22日:35:06.315:ERROR/AndroidRuntime(3275):在android.view.SurfaceView.reportSurfaceDestroyed(SurfaceView.java:613) 9月10日至22日:35:06.315:ERROR/AndroidRuntime(3275):在android.view.SurfaceView.updateWindow(SurfaceView.java:498) 10-22 09:35:06.315:錯誤/ AndroidRuntime(3275):在android.view.SurfaceView.updateWindow(SurfaceView.java: 407) 9月10日至22日:35:06.315:ERROR/AndroidRuntime(3275):在android.view.SurfaceView.onWindowVisibilityChanged(SurfaceView.java:217) 9月10日至22日:35:06.315:ERROR/AndroidRuntime(3275) :在android.view.View.dispatchWindowVisibilityChanged(查看。的java:4080) 9月10日至22日:35:06.315:ERROR/AndroidRuntime(3275):在android.view.ViewGroup.dispatchWindowVisibilityChanged(ViewGroup.java:720) 9月10日至22日:35:06.315:ERROR/AndroidRuntime( 3275):at android.view.ViewGroup.dispatchWindowVisibilityChanged(ViewGroup.java:720) 10-22 09:35:06.315:ERROR/AndroidRuntime(3275):at android.view.ViewRoot.performTraversals(ViewRoot.java:790) 9月10日至22日:35:06.315:ERROR/AndroidRuntime(3275):在android.view.ViewRoot.handleMessage(ViewRoot.java:1868) 9月10日至22日:35:06.315:ERROR/AndroidRuntime(3275):在android.os.Handler.dispatchMessage(Handler.java:99) 10-22 09:35:06.315:ERROR/AndroidRuntime(3275):at android.os.Looper.loop(Looper.java:123) 10-22 09:35:06.315:ERROR/AndroidRuntime(3275):at android.app.ActivityThread.main(ActivityThre ad.java:3691) 9月10日至22日:35:06.315:ERROR/AndroidRuntime(3275):在java.lang.reflect.Method.invokeNative(本機方法) 9月10日至22日:35:06.315:ERROR/AndroidRuntime (3275):at java.lang.reflect.Method.invoke(Method.java:507) 10-22 09:35:06.315:ERROR/AndroidRuntime(3275):at com.android.internal.os.ZygoteInit $ MethodAndArgsCaller .RUN(ZygoteInit.java:847) 9月10日至22日:35:06.315:ERROR/AndroidRuntime(3275):在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:605) 9月10日至22日:35:06.315:ERROR/AndroidRuntime(3275):at dalvik.system.NativeStart.main(Native Method) 10-22 09:35:06。320:ERROR /(18080):Dumpstate> /數據/日誌/ dumpstate_app_error

+0

我的解決方案是否有效? – Carnal

+0

謝謝,但沒有。現在,當我在幾秒鐘後打開主頁按鈕時,我的應用程序正在崩潰。任何其他想法? – goote

+0

所以當你按下home按鈕時,你想破壞surfaceview?這是你問的嗎? – Carnal

回答

2

我不認爲這部分是必要的:

synchronized (mPauseLock) { 
     while (!running) { 
      try { 
       mPauseLock.wait(); 
      } catch (InterruptedException e) { 
      } 
     } 
    } 

如果你使用這個,你需要以通知在wait()上釋放鎖定; 但是儘量使用相同的代碼,用了同步(mPauseLock)

編輯:

當您按下Home鍵,應用程序崩潰你的問題的解決方案,這樣做:

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    gameView = new GameView(this); 
    setContentView(gameView); 
} 

@Override 
public void onPause(){ 
    super.onPause(); 
    gameView.gameLoopThread.setRunning(false); 
    finish(); 
} 

而且在GameView(SurfaceView)創建的構造:

public GameLoopThread gameLoopThread; 

public GameView(Context context) { 
    super(context); 
    gameLoopThread = new GameLoopThread(this); 
} 
+0

感謝您的幫助。我現在看到了您的編輯。這很好地結束了應用程序而不會崩潰,但遊戲狀態並未保存。任何想法? – goote

+0

看看這個:http://stackoverflow.com/questions/151777/how-do-i-save-an-android-applications-state – Carnal

3

回到以前,當我的應用程序隨機(相當常)墜毀活動。 原因是「try」語句不能按預期工作,因爲Canvas c在getHolder()方法之後仍可爲null。

while (running) { 
    Canvas c=null; 
    startTime=System.currentTimeMillis(); 
    try { 
     c=view.getHolder().lockCanvas(); 
     if(c!=null){ // <- this is the line of code I had to add to make it work 
      synchronized (view.getHolder()) { 
       view.onDraw(c); 
      } 
     } 
    } catch (Exception e) {} 
    finally{ 
     if(c!=null) 
     view.getHolder().unlockCanvasAndPost(c); 
    } 
    //... 
} 
+0

我有一個工作的遊戲,但重構後,我有一個問題恢復它。我可以在其上運行一個活動後恢復表面視圖,或者在按下並從家中恢復後使其正常工作。由於您檢查c是否爲空的建議,因此按下HOME之後的崩潰部分被修復。那謝謝啦! – MacD