所有做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);
}
}