繁体   English   中英

解决Android / OpenGL IllegalStateException

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM