2011-08-15 82 views
7

我有一個使用SurfaceView實現來顯示對象的遊戲。 我有一個線程在屏幕上繪製SurfaceView的時間。 遊戲運行完畢。 不幸的是,每當遊戲中斷時,它都需要暫停功能。 那麼,我知道我需要操縱onResume和。重新啓動/暫停onResume/onPause中的線程

但我不明白。該錯誤指向我回到surfaceCreated,在那裏我啓動線程,告訴我線程已經啓動。我試着在onResume和上分別使用resumesuspend,但沒有任何變化。

我該如何做到這一點? 我已經完成了如何使用File-I/O處理保存對象位置。

在此先感謝。

+0

可能的重複[如何暫停/恢復線程在Android?](http://stackoverflow.com/questions/6776327/how-to-pause-resume-thread-in-android) – Wroclai

+0

可悲的是。它沒有工作。 –

回答

1

不知道代碼的來龍去脈。

要「暫停」線程,你可以像這樣實現的功能:

while(! this.isInterrupted()) 
    if(!paused) 
    { 
     ... Do something ... 
    } else { try { Thread.sleep(100) } catch (InteruptedException ie) {} } 

是,如果Do something是無效的面視圖或您的應用程序,否則控制進程根據。 paused的訪問者應該允許您暫停並恢復您的線程,而不會陷入任何其他體系結構中。

2

實際上,不建議您自己停止線程,不建議使用stop()方法。最簡單的解決方案是在線程的run()方法內的while循環中使用一個標誌。當你需要「停止」這個線程時,你只需將該標誌設置爲false,並且該線程不會再做任何事情,儘管它將繼續運行。 Android會在需要時停止線程。希望這可以幫助。

+0

好吧,那麼當我從'onPause'設置運行標誌爲false時,如何重新啓動正在運行的線程。 –

+0

@Cyril Horad,您的應用程序將剛剛啓動另一個線程,執行相同的任務 – Egor

+0

啓動另一個線程?但是這不是從一開始就開始這項任務嗎? –

3

這是我做過什麼:

@Override 
    public void surfaceCreated(SurfaceHolder arg0) { 
      if (thread.getState() == Thread.State.TERMINATED){ 
       CreateThread(getHolder(),getContext()); 
      } 
      thread.setRunning(true); 
      thread.start(); 
    } 
  • 在CreateThread的,你應該有線程=新MyThread的(...);
  • setRunning(boolean mRun)使用布爾值來啓動/停止運行功能(我想我受到了LunarLander的啓發);

如果您想正確使用onPause/onResume,請不要將線程使用的變量放在線程中(如LunarLander所做的那樣)。我建議你做這樣的:

// Variables declarations 

public MyGameThread CreateThread(...){ 
thread = new MyGameThread(holder, context, new Handler() { 
// and so on.... 
}); 
} 

當你穿過的onPause /的onResume,你的線程將被銷燬,reneweled,但如果你把你的變量外,你可以繼續後使用這些數據。

如果你有保存一些重要的東西,利用這一選項之一:

  • SharedPreferences:一個XML將被創建並用,即使該應用程序結束之後仍然存在變量保存在本地;
  • 一個SQL數據庫,如果你將管理超過5-10個變量,因爲在這種情況下使用前一個選項將會很困難。
+0

你可以進一步擴展嗎?我無法通過它。回覆晚了非常抱歉。 –

+0

好吧,開始學習這個博客:http://wonton-games.blogspot.com/2010/06/lunar-lander-resume-game-workaround.html我在那裏得到了很多有關「月亮問題」的信息。之後,回來一個詳細的問題;) – Zappescu

1

我不確定,如果你已經在這個問題上有一個或兩個線程,我假設2.你需要,當你調用的onPause做三兩件事:

1 - Save the state of the application (all game variables, states, etc) 
2 - Kill the surfaceView by calling suspend. 
3 - Kill the other thread (we'll call it Thread B). 

主題殺害B是你的問題,我想。你想中斷線程並告訴它退出,否則當你調用onPause時,你的線程仍然會做它的事情。然後,當你回到遊戲中時,線程將嘗試再次創建,這會導致問題。有2種方式妥善殺死一個線程:

  • while()循環的線程,有一個布爾「跑」,這while(run)將執行代碼。當您將運行更改爲false時,該線程退出。
  • 如果你的線程睡眠(我認爲它可能會做,因爲它的遊戲,將運行w.r.t時間),趕上InterruptedException,然後退出。當你想殺死線程時,你會拋出異常到線程。

第一個是迄今爲止最簡單的。