Android - EGL Surface,关闭时出错

时间:2012-04-24 15:01:37

标签: android canvas glsurfaceview

每次关闭应用时都会出现错误。我不知道为什么?它仅发生在2.3.7。 在3.2和4

上一切正常
FATAL EXCEPTION: main
java.lang.NullPointerException
at android.opengl.GLSurfaceView.onDetachedFromWindow(GLSurfaceView.java:533)
at android.view.View.dispatchDetachedFromWindow(View.java:6190)
at android.view.ViewGroup.dispatchDetachedFromWindow(ViewGroup.java:1162)
at android.view.ViewGroup.dispatchDetachedFromWindow(ViewGroup.java:1162)
at android.view.ViewGroup.dispatchDetachedFromWindow(ViewGroup.java:1162)
at android.view.ViewRoot.dispatchDetachedFromWindow(ViewRoot.java:1751)
at android.view.ViewRoot.doDie(ViewRoot.java:2766)
at android.view.ViewRoot.die(ViewRoot.java:2736)
at android.view.WindowManagerImpl.removeViewImmediate(WindowManagerImpl.java:218)
at android.view.Window$LocalWindowManager.removeViewImmediate(Window.java:477)
atandroid.app.ActivityThread.handleDestroyActivity(ActivityThread.java:2822)
at android.app.ActivityThread.access$2100(ActivityThread.java:123)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:972)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:130)
at android.app.ActivityThread.main(ActivityThread.java:3835)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:507)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:847)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:605)
at dalvik.system.NativeStart.main(Native Method)

2 个答案:

答案 0 :(得分:2)

可能与此重复:GLSurfaceView.onDetachedFromWindow

关闭窗口时游戏是否真正正常运行?在另一个问题听起来他们从来没有附加渲染器,但我不确定在你的情况下这是否正确。

答案 1 :(得分:0)

Because on 2.3 the GLSurfaceView.onDetachedFromWindow method didn't do nullpointer protection;However this method did nullpointer protection on other version above 2.3.

protected void onDetachedFromWindow() {
  super.onDetachedFromWindow();
  mGLThread.requestExitAndWait();
}

the solution is that set a render for your GLSurfaceView object like below:
mGLSurfaceView.setRenderer(new MyRenderer());

mGLThread is init in setRenderer() method;the code is below:

    public void setRenderer(Renderer renderer) {
        checkRenderThreadState();
        if (mEGLConfigChooser == null) {
            mEGLConfigChooser = new SimpleEGLConfigChooser(true);
        }
        if (mEGLContextFactory == null) {
            mEGLContextFactory = new DefaultContextFactory();
        }
        if (mEGLWindowSurfaceFactory == null) {
            mEGLWindowSurfaceFactory = new DefaultWindowSurfaceFactory();
        }
        mRenderer = renderer;
        mGLThread = new GLThread(mThisWeakRef);
        mGLThread.start();
    }
so if you have set a renderer on 2.3,you would not met the nullpointer exception;Hope this could help you.