PagerAdapter Android Lollipop上的unbindDrawables不起作用

时间:2015-11-03 10:54:42

标签: android android-viewpager android-5.0-lollipop

我正在尝试创建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及更高版本上测试我的应用程序时,我的内存不足异常。当我调试我的代码时,我看不到问题。谁能帮我 ?感谢。

1 个答案:

答案 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内存分析器的问题,这个问题主要围绕着这个问题。

Leaked unreferenced byte[] originally from bitmap but recycled() causing memory-leak (until activity stopped)