内存泄露的一些方案

来源:互联网 发布:windows密钥能用几次 编辑:程序博客网 时间:2024/05/18 04:01

所有做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
原创粉丝点击