2014-02-18 58 views
0

我的應用程序有第二個包含GLSurfaceView的Activity。這顯示了第一個活動中整理的OpenGL ES 1.0圖表數據。包括方位變化在內的一切都很好。應用程序可以彈出和退出兩個活動,處理方向更改並且沒有任何問題。但是,如果我在第二個活動中顯示OpenGL圖表,然後按下Android主屏幕,然後從菜單上的應用程序列表中選擇它,然後回到應用程序,我會收到一條消息:「不幸的是, XXX已經停止。「解決Android/OpenGL IllegalStateException

在Logcat中,我看到這個:IllegalStateException: setRenderer has already been called for this instance,我已經將它跟蹤到mGLView.setRenderer (new GLRenderer (this));我在Activity的onStart()方法中的代碼行。

我把日誌行立即在前面,這個電話之後......當崩潰發生,我看到的logcat以下...

02-18 09:48:08.743 1953-1953/com.hippo.happ I/HActivity? Just before the setRenderer call... 
02-18 09:48:08.753 1953-1953/com.hippo.happ D/AndroidRuntime? Shutting down VM 
02-18 09:48:08.753 1953-1953/com.hippo.happ W/dalvikvm? threadid=1: thread exiting with uncaught exception (group=0xb0d75b08) 
02-18 09:48:08.763 1953-1953/com.hippo.happ E/AndroidRuntime? FATAL EXCEPTION: main 
    Process: com.hippo.happ, PID: 1953 
    java.lang.RuntimeException: Unable to resume activity {com.hippo.happ/com.hippo.happ.HChartActivity}: java.lang.IllegalStateException: setRenderer has already been called for this instance. 

但我沒有看到這一點,除非活動被首次創建:

02-18 09:47:51.123 1953-1953/com.hippo.happ I/HActivity? Just after the setRenderer call... 

我可以證實,我調用setEGLContextClientVersion可言,我也沒有改變渲染模式setRenderMode。 I 具有實施onPause()onResume()

我可以使用一些代碼來檢查「setRenderer是否已經被調用這個實例」(我看不到在文檔中適當的獲取或檢查方法),或者我可以圍繞在try..catch setRender行阻止和扼殺IllegalStateException?那會是推薦的方式來解決這個問題嗎?

+0

IllegalStateException **可以被忽略 - 如果已經完成,OpenGL圖表會按預期的方式返回,它並不認爲這是做這件事的正確方法,但至少應用程序不會' t崩潰。我歡迎任何其他的建議...... – Hippogriff

回答

0

onStart()在Activity的可見生命週期開始時被調用。所以當你進入主屏幕並返回時,這是第一個運行的生命週期事件。由於您在該方法中設置了渲染器,因此在創建活動時以前設置失敗。理想情況下,您應該將渲染器設置爲onCreate()的一部分,因爲當該活動恢復時,該渲染器不會再次運行。

我假設你有一個類,它的子類是你在onCreate()中實例化的GLSurfaceView。您可以在該類的構造函數中設置渲染器。或者如果你的代碼已經做到了,但是在onStart()中實例化了GlSurfaceView,它應該只是將它移動到onCreate()的一個例子。

+0

謝謝你,我的'GLSurfaceView'是在片段的XML中定義的。因爲我不能使用mGLView =(GLSurfaceView)this.findViewById(R.id.glSurface);''in''in'我想我把'mGLView.setRenderer(new GLRenderer(this))'''的onCreate()'。我會再看看這個。 – Hippogriff

+0

我明白了,我不知道你在使用片段。在那種情況下,我認爲在onCreateView中設置它可能會工作正常(在片段onCreate後運行)。你可以訪問該方法中的片段佈局(我假設這是你膨脹它的地方),它只會運行一次。 – NigelK

相關問題