内存泄露的一些方案

所有做Android开发的同学应该都遇到过内存泄露的问题。

我们现在在做的是一个广告的sdk,主要做的是海外市场的,但是我们的用户主要是国内的开发者。这些开发者,因为规模不一样,对内存泄露的容忍程度也不一样。

最近遇到几个比较大的开发者,对内存泄露问题非常在意。我们在这个上面已经花费了2个工作日的时间去处理。

在今天发现一个比较容易忽略的问题。


因为我们是广告sdk,广告中一般都会带有图片而这些图片也就成了bitmap。然后就有可能导致资源无法回收。

之前的时候,我的做法是,先遍历存放bitmap的集合,同时释放bitmap,然后再释放整个view资源。

可是监测后还是会有内存泄露,并不能保证内存及时的释放。


后来请教了开发者的工程师之后,才意识到可能是我们的释放顺序不对。

应该要 先释放视图,并将图片和imgageview解绑。然后清空view。最后再回收存放bitmap和存放他的集合。


另外有一个比较好的处理imageview造成的内存泄露的方法。


private void nullViewDrawablesRecursive(View view) {
    if (view != null) {
        if (view instanceof ViewGroup) {
            ViewGroup viewGroup = (ViewGroup) view;
            int childCount = viewGroup.getChildCount();
            nullViewDrawable(view);
            for (int index = 0; index < childCount; index++) {
                View child = viewGroup.getChildAt(index);
                nullViewDrawablesRecursive(child);
            }
        } else {
            nullViewDrawable(view);
        }
    }
}

private void nullViewDrawable(View view) {
    if (null != view) {
        view.setBackgroundDrawable(null);
        if (view instanceof ImageView) {
            ImageView imageView = (ImageView) view;
            imageView.setImageDrawable(null);
            imageView.setBackgroundDrawable(null);
        }
        view.destroyDrawingCache();
        view.setLayerType(View.LAYER_TYPE_NONE, null);
        view.setVisibility(View.GONE);
    }
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值