2011-05-17 45 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