2011-08-20 186 views
3

我有一個由遊戲引擎(線程)管理的SurfaceView活動。我重寫了onCreate和onSaveInstanceState來管理線程的保存/恢復狀態。當活動停止並恢復時保存SurfaceView的狀態

當從該Activity的菜單訪問首選項屏幕時,該Activity會在其生命週期中進入onStop;當首選項屏幕關閉時,Activity將再次從onResume開始,因此onCreate不會發生。然而,線程處於TERMINATED狀態,因此無法恢復。

是的,我可以創建一個新的線程實例 - 但我該如何恢復狀態?我也試着重寫onRestoreInstanceState,但經過快速測試和更徹底的閱讀後,我意識到它不會在這種情況下調用,因爲它在onStart和onResume之間調用。

處理這個問題的最佳方法是什麼?

回答

0

這個問題似乎與我的應用程序的髒設計。由於遊戲引擎本身正在擴展Thread類並自動設置爲TERMINATED,所以當前設計的唯一選擇是向surfaceCreated方法添加邏輯。在那裏,我可以檢查線程的狀態:

如果它是TERMINATED,我可以創建一個Bundle並將它傳遞給我的引擎的saveState方法。一旦我擁有了狀態,我就可以將線程變成一個新的遊戲引擎線程,並通過最近保存的Bundle。我認爲繼續照常(開始線程)。

這可行,但最好的辦法是將實際的線程邏輯移動到一個單獨的類。由於遊戲引擎並沒有被清除,我只是創建一個新的Thread實例,而不是重新創建整個遊戲引擎,所以這就是我要做的。

+0

你沒有提到你的問題中的遊戲引擎!你的問題是一個普遍問題,但你在特殊情況下解決了它。 –

+0

這裏的問題與線程有關,而不是遊戲引擎的實現;我在這種情況下提出的解決方案是,在實現任何管理狀態的遊戲引擎實現時,不會從'Thread'繼承。 – areyling

1

我想你需要針對onSaveInstanceState,要麼onRestoreInstanceState或使用onCreate功能來做到這一點(onRestoreInstanceStateonStart後調用,而onCreateonStart之前稱爲 - 所以你需要使用這樣的方式onCreate的事情,雖然我將列出以下兩種)

保存狀態在活動onSaveInstanceState - 你可能需要寫getter方法到您的surfaceView類:

protected void onSaveInstanceState(Bundle outState) { 
    outState.putInt(YourSurfaceViewClass.SOME_ID, surfaceViewClass.getVar()); 
    super.onSaveInstanceState(saveBundle); 
} 

和還原在onCreate值:

public void onCreate(Bundle savedInstanceState) { 
    if (savedInstanceState != null){ 
    value = savedInstanceState.getInt(YourSurfaceViewClass.SOME_ID); 
    } 
} 

restoreInstanceState

@Override 
protected void onRestoreInstanceState(Bundle savedInstanceState) { 
    value = savedInstanceState.getInt(YourSurfaceViewClass.SOME_ID); 
} 

當您訪問首屏,然後用onCreate來恢復你的線程的狀態,這些方法會被調用。

+0

感謝您的回覆。我已經嘗試過了,正如我在帖子中提到的那樣。在這種情況下,onCreate不會被調用,並且它們都不是onRestoreInstanceState [因爲它直接訪問onResume]。 – areyling