我正在尝试创建Double View寻呼机,我从PagerAdapter覆盖 @Override
public void destroyItem(ViewGroup container, int position, Object object)
{
container.removeView((View) object);
unbindDrawables((View) object);
System.gc();
object = null;
}
protected void unbindDrawables(View view)
{
if (view instanceof ImageView)
{
Drawable drawable = ((ImageView) view).getDrawable();
if (drawable instanceof BitmapDrawable) {
BitmapDrawable bitmapDrawable = (BitmapDrawable) drawable;
Bitmap bitmap = bitmapDrawable.getBitmap();
bitmap.recycle();
}
ImageWorker.cancelWork(((ImageView) view));
((ImageView) view).setImageResource(0);
((ImageView) view).setImageDrawable(null);
}
if (view.getBackground() != null)
{
view.getBackground().setCallback(null);
}
if (view instanceof ViewGroup)
{
for (int i = 0; i < ((ViewGroup) view).getChildCount(); i++)
{
unbindDrawables(((ViewGroup) view).getChildAt(i));
}
if (!(view instanceof AdapterView<?>))
{
((ViewGroup) view).removeAllViews();
}
//((ViewGroup) view).removeAllViews();
}
}
函数,就像下面的代码一样:
contains
Android KitKat,Jelly Bean上的一切都很好,即使是姜饼和冰淇淋三明治,但是当我尝试在API 21及更高版本上测试我的应用程序时,我的内存不足异常。当我调试我的代码时,我看不到问题。谁能帮我 ?感谢。
答案 0 :(得分:0)
我无法从代码中看到从视图层次结构中删除了imageview,如果在imageView而不是viewgroup上调用unbindDrawables,那么它将无法删除imageview位图泄漏。我有一个类似的内存不足的问题,结果是ImageView阻止了来自位图的GC的byte [],我找到的唯一解决方案是从视图层次结构中删除ImageView(并丢弃引用)。对我来说,进行以下清理是不够的
if (imageView.getBackground() != null) {
imageView.getBackground().setCallback(null);
}
setImageBackground(imageView, null);
imageView.setImageBitmap(null);
imageView.setImageDrawable(null);
我还有很多关于Android Studio内存分析器的问题,这个问题主要围绕着这个问题。