常见View特别是WebView引发内存泄漏解决办法

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/cysion1989/article/details/78793442

内存泄漏是安卓开发中常见的一种情况,其原因本质上是一个生命周期更长的对象持有了一个本该回收对象的引用,几种具体的表现已经有很多博客进行了分析,比如全局/单例对象,集合,内部类,线程,资源对象等等。然而,还有一类泄漏,往往是View相关的源码层造成的泄漏:

  • 比如当一个Drawable被附加到View时,这个View会被设置为这个Drawable的callback,即持有其引用;
  • 还有EditText的inputType=’text’在某些版本和机型下也会有内存泄漏;
  • WebView更是一个容易内存泄漏的view。

当然,还有一些其它情况造成的View相关的内存泄漏,这里就不多说了,本文只是记录一个比较通用的解决方式。

public class ViewUtils {

    private static volatile ViewUtils instance;

    private ViewUtils() {

    }

    public static synchronized ViewUtils get() {
        if (instance == null) {
            instance = new ViewUtils();
        }
        return instance;
    }

    //优化内存
    public void gcViews(View view) {
        if (view == null) {
            return;
        }
        if (view.getBackground() != null) {
            view.getBackground().setCallback(null);
        }
        if (view instanceof ViewGroup && !(view instanceof AdapterView)) {
            if (view instanceof WebView) {
                ViewParent parent = view.getParent();
                if (parent != null) {
                    ((ViewGroup) parent).removeView(view);
                }
                ((WebView) view).removeAllViews();
                ((WebView) view).destroy();
                return;
            }
            for (int i = 0; i < ((ViewGroup) view).getChildCount(); i++) {
                gcViews(((ViewGroup) view).getChildAt(i));
            }
            ((ViewGroup) view).removeAllViews();
        }
    }
}

如上面代码,创建个工具类,然后在合适的位置(一般是activity或者fragment的onDestroy()方法中)调用。比如

 ViewUtils.get().gcViews(getWindow().getDecorView());

猜你喜欢

转载自blog.csdn.net/cysion1989/article/details/78793442
今日推荐