Android 发布surfaceview

Android 发布surfaceview,android,surfaceview,viewgroup,Android,Surfaceview,Viewgroup,我有一个自定义的ViewGroup,其中包含大约10个SurfaceView。当您按下一个按钮时,将解析一个xml文件并生成一个包含10个以上曲面视图的外观。然后,这些视图被添加到视图组中,视图组被失效,之前的10个SurfaceView被viewgroup.removeView删除。这是为了避免闪烁。这一切都很好,但在做了8次之后,我开始耗尽内存,lockCanvas在新的surfaceviews上返回null。removeView,并将对曲面视图的所有引用设置为null,是否就是释放曲面所需

我有一个自定义的
ViewGroup
,其中包含大约10个
SurfaceView
。当您按下一个按钮时,将解析一个xml文件并生成一个包含10个以上曲面视图的外观。然后,这些视图被添加到视图组中,视图组被失效,之前的10个SurfaceView被
viewgroup.removeView
删除。这是为了避免闪烁。这一切都很好,但在做了8次之后,我开始耗尽内存,
lockCanvas
在新的surfaceviews上返回null。
removeView
,并将对曲面视图的所有引用设置为null,是否就是释放曲面所需的全部内容?下面是删除视图的代码的外观:

if (viewsToRemove.isEmpty() == false) {

    this.post( new Runnable() 
    {  
        public void run() { 
            if (viewsToRemove.isEmpty() == false) {
                for (IView v : viewsToRemove) {
                    SurfaceView sv = (SurfaceView)v;
                    removeView(sv);
                    v.cleanup();
                }
                viewsToRemove.clear();
                System.gc();
                invalidate();
            }
        } 
    }); 
}

在绘制新的
SurfaceView
后,此代码块将在
onDraw
中运行(以避免闪烁)。我尝试过垃圾收集,也尝试过手动调用
SurfaceView
的finalize方法,这是
v.cleanup
调用所做的,但过了一段时间内存仍然不足。它似乎在安卓4.0上运行,但在上不起作用。我相信我解决了这个问题。我认为并非所有视图都被添加到viewsToRemove ArrayList中,因为条件逻辑不正确

09-25 14:51:01.419: E/Surface(4131): Surface (identity=17237) requestBuffer(1, 0, 0, 1, 00000203) returned a buffer with a null handle
09-25 14:51:01.419: E/Surface(4131): getBufferLocked(1, 0, 0, 1, 00000203) failed (Out of memory)
09-25 14:51:01.419: E/Adreno200-EGL(4131): egliSwapWindowSurface: unable to dequeue native buffer
09-25 14:51:01.469: E/Surface(4131): Surface (identity=17237) requestBuffer(1, 0, 0, 1, 00000203) returned a buffer with a null handle
09-25 14:51:01.469: E/Surface(4131): getBufferLocked(1, 0, 0, 1, 00000203) failed (Out of memory)
09-25 14:51:01.469: E/Adreno200-EGL(4131): eglLockWindowSurface: unable to dequeue native buffer


09-25 14:51:01.549: E/AndroidRuntime(4131): FATAL EXCEPTION: GLThread 25
09-25 14:51:01.549: E/AndroidRuntime(4131): java.lang.RuntimeException: eglSwapBuffers failed: EGL_BAD_ALLOC
09-25 14:51:01.549: E/AndroidRuntime(4131):     at android.opengl.GLSurfaceView$EglHelper.throwEglException(GLSurfaceView.java:1080)
09-25 14:51:01.549: E/AndroidRuntime(4131):     at android.opengl.GLSurfaceView$EglHelper.swap(GLSurfaceView.java:1038)
09-25 14:51:01.549: E/AndroidRuntime(4131):     at android.opengl.GLSurfaceView$GLThread.guardedRun(GLSurfaceView.java:1364)
09-25 14:51:01.549: E/AndroidRuntime(4131):     at android.opengl.GLSurfaceView$GLThread.run(GLSurfaceView.java:1118)