首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >发布surfaceview

发布surfaceview
EN

Stack Overflow用户
提问于 2012-09-26 04:24:41
回答 1查看 1.9K关注 0票数 0

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

代码语言:javascript
复制
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调用所做的,但过了一段时间仍然会耗尽内存。它似乎在Android4.0上有效,但在<= 2.3.x上不起作用。

以下是adb显示的错误:

代码语言:javascript
复制
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)

任何帮助都将不胜感激。

EN

回答 1

Stack Overflow用户

发布于 2012-09-27 01:09:25

我相信我解决了这个问题。我认为由于错误的条件逻辑,并不是所有的视图都被添加到viewsToRemove ArrayList中。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12590498

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档