出于某种原因,我需要重新启动GLSurfaceView.Renderer所以我想了一段时间我的应用程序调用setRenderer(newRenderer)第二次,其中
Android不喜欢和抛出一个IllegalStateException异常说“setRenderer已经被称为” .. .
现在,我知道这是因为渲染器附加到GLSurfaceView,我需要将此渲染器解除绑定到表面视图,因此我可以再次调用setRenderer.
有人有解决方案吗?
P.S:
代码如下所示:
render = new Renderer(this); setContentView(R.layout.main); graphicView = (GLSurfaceView) this.findViewById(R.id.graphicView); //DO STUFF graphicView.setRenderer(render); //DO STUFF Renderer newRender = new Renderer(); graphicView.setRenderer(newRender); <= ...and Android hates this line sooo much
谢谢 !
解决方法
找到答案
here,这个“LemonDev”确实拯救了我的生命:
可以停止/销毁OpenGL表面视图,并通过调用OnPause()将新的GLSurfaceView设置为新的渲染器,并使用Handler和Runnable postDelayed destroy,如下所示:
final Renderer newRender = new GRenderer(this); final LinearLayout ll = (LinearLayout) this.findViewById(R.id.main); graphicView.onPause(); Handler handler = new Handler(); class RefreshRunnable implements Runnable{ public RefreshRunnable(){ } public void run(){ ll.removeView(findViewById(R.id.graphicView)); GLSurfaceView surfaceview = new GLSurfaceView(getApplication()); surfaceview.setId(R.id.graphicView); surfaceview.setRenderer(newRender); ll.addView(surfaceview); graphicView = (GLSurfaceView) findViewById(R.id.graphicView); } }; RefreshRunnable r = new RefreshRunnable(this); handler.postDelayed(r,500);
这将创建一个新的渲染器并暂停GLSurfaceView.然后应用程序将“销毁”一些你无法用SDK接触的内部东西……之后,你可以销毁GLSurfaceView,创建另一个并为其设置新的渲染器.
我现在的问题是纹理还没有刷新,但是,这仍然很棒!