如何修复SurfaceView中的内存泄漏 [英] How to fix memory leak in SurfaceView

查看:811
本文介绍了如何修复SurfaceView中的内存泄漏的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在Surfaceview中遇到了内存泄漏问题.

I met a memory leak issue in surfaceview.

我定义了一个从表面视图延伸的自定义视图MyView.

I define a custom view MyView which extends from surfaceview.

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

和onContent()中的setContentView; 完成活动后. 我得到下面的日志; 它显示表面"视图中存在内存泄漏.

and setContentView in onCreate(); after finish the Activity. I get the log below; It show the there are memory leak in Surface view.

我希望有人可以帮助我解决这个问题.谢谢!

I hope someone can help me to resolve this. Thank you!

使用Android 4.2.

use 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)

推荐答案

我找到了解决此问题的方法. 您应该简单地致电:

I found the workaround for this issue. You should simple call:

getHolder().getSurface().release();

在活动"的onDestroy()

类似这样的东西:

class MyView {

    ...

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

    ...
}

class MyActivity extends Activity {

    ...

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

    ...

}

这篇关于如何修复SurfaceView中的内存泄漏的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆