[英]Resolving Android / OpenGL IllegalStateException
我的应用程序有另一个Activity,其中包含GLSurfaceView。 这显示了第一个Activity中整理的OpenGL ES 1.0数据图表。 一切,包括方向更改,都可以正常工作。 该应用程序可以弹出和退出这两个活动,可以处理方向更改,并且不会出错。
但是,如果我在第二个活动中显示OpenGL图表并按Android HOME屏幕,然后通过从MENU上的应用程序列表中选择它来返回到该应用程序,则会收到一条消息,提示“很遗憾,XXX已停止。 ”
在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
更改渲染模式。 我已经实现了onPause()
和onResume()
。
我可以使用一些代码来检查“是否已为此实例调用setRenderer”(我在文档中看不到适当的get或check方法),还是可以将try..catch块中的setRender
行和其他IllegalStateException
? 这是解决此问题的推荐方法吗?
在活动的可见生命周期的开始时调用onStart()。 因此,当您转到主屏幕并返回时,这是第一个运行的生命周期事件。 由于您在该方法中设置了渲染器,因此如果失败,则因为它是在创建Activity时先前设置的。 理想情况下,应将渲染器设置为onCreate()的一部分,因为在Activity恢复时该渲染器不会再次运行。
我假设您有一个类,它是GLSurfaceView的子类,您可以在onCreate()中实例化该类。 您可以在该类的构造函数中设置渲染器。 或者,如果您的代码已经做到了,但是在onStart()中实例化了GlSurfaceView,则希望只是将其移至onCreate()的一种情况。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.