2013-08-22 91 views
1

我遇到了Surfaceview中的内存泄漏问题。如何修复SurfaceView内存泄漏

我定义了一个自定义视图MyView,它从surfaceview扩展而来。

int Layout file 
<com.andoird.example.MyView 
.... 
.... 
/> 

和setContentView in onCreate();活动完成后,请拨打 。 我得到下面的日志; 它显示表面视图中有内存泄漏。

我希望有人能帮我解决这个问题。谢谢!

使用Android 4.2。

日志1:

08-16 16:29:23.751 E/StrictMode(23220): A resource was acquired at attached stack trace but never released. See java.io.Closeable for information on avoiding resource leaks. 
08-16 16:29:23.751 E/StrictMode(23220): java.lang.Throwable: Explicit termination method 'release' not called 
08-16 16:29:23.751 E/StrictMode(23220):  at dalvik.system.CloseGuard.open(CloseGuard.java:184) 
08-16 16:29:23.751 E/StrictMode(23220):  at android.view.Surface.<init>(Surface.java:293) 
08-16 16:29:23.751 E/StrictMode(23220):  at android.view.SurfaceView.<init>(SurfaceView.java:101) 

日志2

08-16 16:29:23.751 E/StrictMode(23220): A resource was acquired at attached stack trace but never released. See java.io.Closeable for information on avoiding resource leaks. 
08-16 16:29:23.751 E/StrictMode(23220): java.lang.Throwable: Explicit termination method 'release' not called 
08-16 16:29:23.751 E/StrictMode(23220):  at dalvik.system.CloseGuard.open(CloseGuard.java:184) 
08-16 16:29:23.751 E/StrictMode(23220):  at android.view.Surface.<init>(Surface.java:293) 
08-16 16:29:23.751 E/StrictMode(23220):  at android.view.SurfaceView.<init>(SurfaceView.java:102) 

回答

2

我发现这个问题的解决方法。 你应该简单的调用:

getHolder().getSurface().release(); 
从活动的 onDestroy()

像这样的东西你的控制

class MyView { 

    ... 

    public void release() { 
     getHolder().getSurface().release(); 
    } 

    ... 
} 

class MyActivity extends Activity { 

    ... 

    @Override 
    public void onDestroy() { 
     super.onDestroy(); 
     mMyView.release(); 
    } 

    ... 

} 
+0

getSurface()似乎并不有一个方法叫释... – MacD