2012-09-17 35 views
0

我正在做我的第一個android遊戲,我的遊戲線程有問題。事情是,當我暫停它,並按回或主頁按鈕,我得到一個錯誤。 「活動(在我的應用程序遊戲)沒有響應我的代碼:?安卓主題暫停/恢復主屏幕按下後沒有響應

public class GameLoopThread extends Thread { 
static final long FPS = 10; 
private GameView view; 
private boolean running = false; 

private Object mPauseLock; 
private boolean mPaused; 

public GameLoopThread(GameView view) { 
    this.view = view; 
} 

public void setRunning(boolean run) { 
    running = run; 
    mPauseLock = new Object(); 
    mPaused = false; 

} 

@Override 
public void run() { 
    long ticksPS = 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); 
      } 
     } 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) { 
     } 

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

    } 

} 

/** 
* Call this on pause. 
*/ 
public void onPause() { 
    synchronized (mPauseLock) { 
     mPaused = true; 
    } 
} 

/** 
* Call this on resume. 
*/ 
public void onResume() { 
    synchronized (mPauseLock) { 
     mPaused = false; 
     mPauseLock.notifyAll(); 
    } 
    } 
    } 

我在做什麼錯

+0

你能提供一個LogCat輸出嗎? –

+0

你在那裏有一個while循環:while(mPaused){...你等待一次,那就夠了,或者應該是。 – fonZ

+0

我不認爲你必須這麼多同步,因爲那隻適用於可以由多個線程修改的對象。 – fonZ

回答

0

最有可能您的應用程序正在試圖當它恢復啓動停止線程這導致一個錯誤,導致應用程序崩潰。

看看你的logcat日誌來檢查。

+0

它關於keyDispatchingTimedOut 09-17 21:50:30.716: – Korangar

+0

它暫停並恢復正常,但如果我暫停,並在按下de back或home按鈕後出現錯誤。 – Korangar

+0

我以前有類似的問題,它不得不與View初始化線程有關,然後當它回到主頁時,它被破壞,但視圖一直試圖啓動它。這可能不是你遇到的問題。現在,我只是猜測:/(我會張貼作爲評論,但不是50代表) – Clark

1

首先,你有沒有嘗試按,同時應用程序運行?如果應用程序仍在運行時,電源按鈕你嘗試之後重新打開應用程序,那麼你的線程代碼和表面類很好。要解決您的問題(主頁按鈕部分),請將此方法添加到您的appcompatactivity中。

public class Game extends AppCompatActivity { 
public int i = 0; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    requestWindowFeature(Window.FEATURE_NO_TITLE); 
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN); 

    setContentView(new YourSurfaceGame(this,"player1")); 
} 
//Add this override method to your appcompatactivity 
@Override 
protected void onStart() { 
    super.onStart(); 
    //Re-declare your surface game class is the main solution here 
    setContentView(new YourSurfaceGame(this,"player1")); 
} 

@Override 
protected void onPause() { 
    super.onPause(); 
} 
} 

花了一個小時,對我來說,雖然我注意到一個奇怪的現象,當我按下HOME和POWER鍵之間比較解決按鈕家庭問題。如果您嘗試使用此代碼並開始注意您的遊戲進度已經消失,那麼https://www.tutorialspoint.com/android/android_shared_preferences.htm就是答案。

我對其他遊戲應用程序做了同樣的事情,我的結論是正確的。按下家庭或電源按鈕後,遊戲暫停。實際上,如果你使用線程作爲擴展,你會發現這個問題,當你在你的mainthread類中使用timertask作爲擴展時,它是不同的。雖然,我從來沒有嘗試過。