2011-08-20 162 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