Android上的OpenGLES – IllegalStateException:setRenderer已经被调用了这个实例

我是Android上的OpenGL-ES的新手,所以请原谅我的问题。 我正在为Android v2.2 – SDK#8构build这个程序。 我的平板电脑支持Android v3.1

我正在尝试为Android设置一个OpenGL-ES环境,请参阅developer.android.com上的教程。 该程序编译得很好,它应该在设备上显示一个简单的蓝屏。 然而,当我试图在我的Android设备上运行它,我得到了“IllegalStateException:setRenderer已经被调用这个实例”的错误。

以下是我的代码:

public class TA_SpaceActivity extends Activity { private MyGLSurfaceView myGLView; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); myGLView = new MyGLSurfaceView(this); //NOTE: this is where the app crashed setContentView(myGLView); } } class MyGLSurfaceView extends GLSurfaceView { public MyGLSurfaceView(Context context) { super(context); setRenderer (new MyRenderer()); setEGLContextClientVersion(2); setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY); } } class MyRenderer implements GLSurfaceView.Renderer { public void onSurfaceCreated(GL10 unsued, EGLConfig config) { GLES20.glClearColor(0.0f, 0.0f, 1.0f, 1.0f); } public void onDrawFrame(GL10 unused) { GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT); } public void onSurfaceChanged(GL10 unused, int width, int height) { GLES20.glViewport(0, 0, width, height); } } 

首先,我确定OpenGLES的uses-feature标签包含在AndroidManifest.xml文件中:

在这里输入图像说明

然后,当我做一个debugging运行时,ActivityThread.perfo显示“Source Not Found”错误消息。 所以,我添加了path(我也确保在目录中存在android.jar文件)

在这里输入图像说明

不过,该应用程序在“myGLView = new MyGLSurfaceView(this)”这一行崩溃了。 当我检查LogCat时,它显示程序在setRenderer()函数调用中抛出了IllegalStateException。

在这里输入图像说明

所以,我现在有两个谜题我不明白:

1)为什么当项目中的源代码链接被明确定义时,会抛出一个“Source Not Found”错误消息?

2)为什么说“setRenderer()已被调用这个实例”? 我只在我的“MyGLSurfaceView”子类中调用过一次。

对于第一个难题,从我所听到的,Eclipse几乎总是会抛出一个“Source Not Found”消息,当你发现每一个随机错误的时候。 这样对吗? (如果没有,请纠正我)。

如果是这种情况,那么我认为问题的根本原因与我的子类中的setRenderer()方法有关。 经过整天搞乱,我找不到解决这个问题的办法。 任何机构会给我一些指针,我可以尝试解决这个“IllegalStateException:setRenderer()已经被调用这个实例”的问题?

预先感谢您的帮助。

Solutions Collecting From Web of "Android上的OpenGLES – IllegalStateException:setRenderer已经被调用了这个实例"

我想到了。 在深入了解Google的文档之后,我发现setGLContextClientVersion()调用了checkRenderThreadState(); 这个函数抛出非法exception“setRenderer()已经被调用这个实例”如果setRenderer()被调用。 所以,我不是首先调用setRenderer(),而是先调用setEGLContextClientVersion(),程序编译并运行没有问题。 我现在看到我的设备上出现了美丽的蓝色屏幕。

这是我做的改变:

 public MyGLSurfaceView(Context context) { super(context); setEGLContextClientVersion(2); setRenderer (new MyRenderer()); setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY); }