Android上的OpenGLES - IllegalStateException:已为此实例调用setRenderer

时间:2012-11-09 02:56:02

标签: android eclipse opengl-es

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

我正在尝试通过developer.android.com上的教程为Android设置OpenGL-ES环境。程序编译得很好,它应该在设备上显示一个简单的蓝屏。但是,当我尝试在我的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文件中:

enter image description here

然后,当我执行Debug运行时,ActivityThread.perfo显示“Source Not Found”错误消息。所以,我添加了它的路径(我还确保目录中存在android.jar文件)

enter image description here

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

enter image description here

所以,我现在有2个难以理解的谜题:

1)为什么在项目中明确定义了源链接时,它会抛出“Source Not Found”错误消息?

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

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

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

提前感谢您的帮助。

1 个答案:

答案 0 :(得分:41)

我明白了。在深入研究Google的文档后,我发现setEGLContextClientVersion()调用了checkRenderThreadState();如果调用了setRenderer(),则此函数抛出非法异常“setRenderer()已为此实例调用”。所以,我没有先调用setRenderer(),而是首先调用了setEGLContextClientVersion(),程序编译运行没有问题。我现在看到我的设备上出现了漂亮的蓝屏。

这是我所做的改变:

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