2011-05-17 44 views
0

我有一个TabHost中的Activity中的SurfaceView派生类(如HelloTabWidget示例)。我使用的SurfaceView附带了优秀的动画图表库:FlotChartContainer.javaTabHost中的SurfaceView导致崩溃

当我在选项卡之间切换时,一切正常。但是,只要包含此视图的选项卡已初始化(例如显示),我的应用程序就会注定失败。每当发生以下情况就会死机:

按下Home键 当我重新打开我的应用程序,它崩溃由于surfaceCreated的IllegalStateException异常()。

开始新的活动 当我开始了新的活动(startActivity),然后按返回键(此方法调用我的SurfaceView的surfaceDestroyed ...?!),它崩溃由于IllegalStateException异常在surfaceCreated()。

  • 我针对API等级7(Android 2.1)。
  • 该代码在未使用TabHost时有效。
  • 切换选项卡不会调用surfaceDestroyed()。相反,使用onPause()和onResume()。
  • 活动完成后,即使它不在活动选项卡中,也会调用surfaceDestroyed()。

请帮忙!

回答

0

onPause()onResume()surfaceChanged()surfaceDestroyed()试验后,我终于想出了一个丑陋的解决方案,解决了这个特定的情况下:

  • 没有XML!以编程方式创建视图。
  • 重新创建并重新添加onResume()中的视图。
  • 删除onPause()中的视图。

@Karthi_heno 您指出我在正确的方向。关键是妥善处理onPause()。然而,我遇到了奇怪的延迟(大约10秒,可能是由于Canvas.lockCanvas()调用)...

0

在onPause(),onStop(),onDestroy()中检查android中的活动生命周期,销毁已在应用程序中使用的表面视图,然后在onResume()中重新创建表面,然后它工作正常。

+0

感谢您的想法。我相信这会起作用。但是,如何销毁从xml布局加载的表面?这是不错的做法吗? – l33t 2011-05-17 08:19:59

+0

我不知道它是否是好的,但我希望它会帮助你的问题,我的相机表面视图,我只有这样处理,像onDestroy()camera.stopPreview()和onResume()camera.startpreview() )。 – Karthi 2011-05-17 09:08:35

+0

给定一个绘图线程的SurfaceView,我应该完全在onPause中销毁线程并在onResume中重新创建它?我早些时候尝试过,大部分都是黑屏。恢复时是否必须重新创建SurfaceHolder? – l33t 2011-05-17 10:34:10