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

内存泄漏是安卓开发中常见的一种情况,其原因本质上是一个生命周期更长的对象持有了一个本该回收对象的引用,几种具体的表现已经有很多博客进行了分析,比如全局/单例对象,集合,内部类,线程,资源对象等等。然而,还有一类泄漏,往往是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());
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值