我可以通過使我的遊戲線程(其中保持/與surfaceview同步)wait/notifyAll來暫停/恢復我的遊戲。這一切都運行良好使用遊戲暫停按鈕。但是,當我點擊主頁/後退按鈕時,我可以暫停我的遊戲,但是當我通過單擊其圖標繼續遊戲時,我會收到無響應的遊戲屏幕。Android:遊戲循環暫停/恢復問題
我在OnResume()方法上放置了日誌,但沒有任何內容被打印到LogCat中! 如果我點擊我的遊戲屏幕,我會在我的遊戲活動中看到「強制關閉」或「等待」錯誤對話框。
爲什麼我得到這個無響應的屏幕就好像我的應用程序暫停後掛起? 如何以與遊戲暫停/恢復按鈕相同的方式處理物理按鈕?
這裏是我的logcat操作視圖。你可以看到onResume sop沒有得到類似於onPause的打印。
編輯:代碼由我暫停/恢復按鈕,並在onPause /的onResume功能 其中 「這」 是線程類本身
protected void setPause(){
synchronized (this) {
isPaused = true;
}
}
protected void setResume(){
synchronized (this) {
isPaused = false;
this.notifyAll();
}
}
遊戲循環代碼調用:
synchronized (this) {
while (running) {
if (isPaused) {
try {
this.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} else {
Canvas c = null;
try {
c = view.getHolder().lockCanvas();
synchronized (view.getHolder()) {
view.onDraw(c);
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
if (c != null) {
view.getHolder().unlockCanvasAndPost(c);
}
}
sleepTime = ticksPS
- (System.currentTimeMillis() - startTime);
try {
if (sleepTime > 0)
sleep(sleepTime);
else
sleep(10);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
這個我怎麼稱它從表面看:
public void surfaceCreated(SurfaceHolder holder) {
// start the game loop
System.out.println("Starting Game Loop @@@@@@@@@");
if(isPaused){
System.out.println("GamePaused");
gameLoopThread.setResume();
}
else{
System.out.println("Game Starting");
gameLoopThread.setRunning(true);
}
gameLoopThread.start();
}
編輯2: 如果我使用暫停按鈕暫停我的遊戲,並讓我的手機自動鎖定...恢復後,我可以正常播放任何問題。 根據日誌我看到在這種情況下表面被破壞不會被調用。
OnResume和OnPause代碼說的是什麼? – Araw
檢查我編輯 –
的帖子上的更新我假設你暫停遊戲的方法「睡覺」在UI線程上。 這不是做到這一點的方法。向我們展示如果遊戲正在執行的代碼 – IncrediApp