我正在分析與James Cho's, "The Beginner's Guide to Android Game Development"相關的代碼,並且遇到了一些與我希望獲得幫助的線程相關的混淆邏輯。如果需要,我正在分析can be downloaded的完整源代碼。在Android中,何時在SurfaceView中創建的線程被破壞?
我正在尋找幫助的具體代碼如下所示。請注意,我忽略了與問題無關的代碼。
public class GameView extends SurfaceView implements Runnable {
private Thread gameThread;
public GameView(Context context, int gameWidth, int gameHeight) {
SurfaceHolder holder = getHolder();
holder.addCallback(new SurfaceHolder.Callback() {
@Override
public void surfaceCreated(SurfaceHolder holder) {
initGame();
}
@Override
public void surfaceChanged(omitted) {omitted}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
pauseGame();
}
});
private void initGame() {
gameThread = new Thread(this, "Game Thread");
gameThread.start();
}
private void pauseGame() {
while (gameThread.isAlive()) {
try {
gameThread.join();
break;
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
我讀到這段代碼的方式,下面的相關邏輯發生:
- 當應用程序第一次啓動並顯示
GameView
,一個新的線程對象被創建並與我們gameThread
相關變量。 - 的
gameThread
被賦予一個名稱,然後start()
版。 - 如果該應用失去焦點/暫停,並且
gameThread
正在運行,gameThread
經由join()
方法暫停。 *注意:我在周圍這個邏輯有點雲裏霧裏* - 如果應用程序恢復對焦/重新啓動,創建一個新的線程,並分配給我們的
gameThread
變量。
我閱讀這個邏輯最初的反應是,「我們爲什麼要創建一個新的線程並將其分配給gameThread
?應該不是之前創建的線程還存在嗎?」我做了一些調試/日誌,並在遊戲之間的某一點發現被暫停後重新啓動,gameThread
主題是「破壞」,因爲如果我嘗試過程中創建並分配initGame()
之前,新的線程,我得到對gameThread
一個.getName()
通話空指針異常。如果現有的gameThread
在暫停和恢復之間被破壞,是否不會消除與該線程關聯的任何遊戲狀態?
有人能走我走過的應用程序有失重點會發生什麼變化線程,然後恢復它(或指向我,做了資源)?