我有一个由游戏引擎(线程)管理的SurfaceView的Activity。我重写了onCreate和onSaveInstanceState来管理线程的保存/恢复状态。
当从该Activity的菜单访问首选项屏幕时,该Activity将通过其生命周期进入onStop;当首选项屏幕关闭时,活动将在onResume上再次启动,因此onCreate不会发生。但是线程处于TERMINATED状态,因此无法恢复。
是的,我可以创建一个新的线程实例 - 但是如何恢复状态呢?我也试过覆盖onRestoreInstanceState,但经过快速测试并稍微阅读后,我意识到在这种情况下没有调用它,因为它是在onStart和onResume之间调用的。
处理此问题的最佳方法是什么?
答案 0 :(得分:1)
我认为您确实需要定位onSaveInstanceState
和onRestoreInstanceState
或使用onCreate
功能来执行此操作(onRestoreInstanceState
在onStart
之后调用,而在onCreate
之前调用onStart
- 所以你需要使用onCreate
做事的方式,虽然我会在下面列出这两种方式)
将您的状态保存在活动的onSaveInstanceState
中 - 您可能需要在getView类中编写getter方法:
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
恢复线程状态时,将调用这些方法。
答案 1 :(得分:0)
问题似乎与我的应用程序的脏设计有关。由于游戏引擎本身正在扩展Thread类并自动设置为TERMINATED
,因此我对当前设计的唯一选择是为surfaceCreated
方法添加逻辑。在那里,我可以检查线程的状态:
如果是TERMINATED
,我可以创建一个Bundle
并将其传递给我的引擎的saveState方法。一旦我拥有状态,我就将线程作为一个新的游戏引擎线程并传入最近保存的Bundle
。我认为继续正常(启动线程)。
这样可行,但最好的方法是将实际的Thread逻辑移动到一个单独的类中。由于游戏引擎实际上并未被清除,我只是创建一个新的Thread
实例,而不是重新创建整个游戏引擎,所以这就是我要做的。