ViewGroup
10代くらい入ってるカスタムしてます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)
どんな助けでも大歓迎です。