0

ViewGroup10代くらい入ってるカスタムしてますSurfaceView。ボタンを押すと、xml ファイルが解析され、さらに 10 個のサーフェス ビューを含むスキンが生成されます。次に、これらがビュー グループに追加され、ビュー グループが無効になり、以前の 10 個のサーフェス ビューが によって削除されviewgroup.removeViewます。これはちらつきを避けるためです。それはすべてうまくいきますが、おそらく8回実行した後、メモリが不足し始めlockCanvas、新しいサーフェスビューで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();
            }
        } 
    }); 
}

このコード ブロックはonDraw、 newSurfaceViewがペイントされた後に実行されます (ちらつきを避けるため)。私はガベージコレクションを試してみましたが、手動でSurfaceView's finalize メソッドを呼び出すことも試みましたが、これはv.cleanup呼び出しが行うことですが、しばらくしてもメモリが不足します。Android 4.0 では動作するようですが、<= 2.3.x では動作しません。

adb が示すエラーは次のとおりです。

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)

どんな助けでも大歓迎です。

4

1 に答える 1

0

私はこれを解決したと信じていました。条件付きロジックが正しくないため、すべてのビューが viewsToRemove ArrayList に追加されたわけではないと思います。

于 2012-09-26T17:09:25.267 に答える