Android幻灯片导致内存泄漏

时间:2016-02-14 18:42:12

标签: java android memory-leaks out-of-memory

我想在Android上进行图片幻灯片放映,只有完整的图像。没有缩略图(如在图库中),没有缩放,没有捏。只有左/右滑动才能从一张图片移动到另一张图片。

Pcitures保存在数据文件夹中,大约有2000张图片。

我使用全屏ViewPager来显示图片。当然我无法一次加载所有2000,所以我只在用户滑动到相应的视图时加载所需的图片。

每次用户滑动到新的viewPager位置时,我都会调用此代码

public void onNewViewToDisplay(Integer newPosition, Integer previousPosition) {
    File file = functionToGetTheCorrespondingFile(newPosition);
    Bitmap bp;
    bp = BitmapFactory.decodeFile(file.getPath());
    ((ImageView)imageAdapter.views.get(newPosition)).setImageBitmap(bp);
    if (previousPosition != null && previousPosition != newPosition) {
        BitmapDrawable bitmapDrawable = 
            ((BitmapDrawable)((ImageView)imageAdapter.views.get(previousPosition)).getDrawable());
        // Set the previous imageView to empty view
        ((ImageView) imageAdapter.views.get(previousPosition)).setImageResource(0);
        // Then free previous bitmap memory
        if (bitmapDrawable != null && bitmapDrawable.getBitmap() != null) {
            bitmapDrawable.getBitmap().recycle();
        }
    }
}

所以我希望我的代码总是释放前面显示的imageview使用的内存。但是当我看看我的记忆职业时

enter image description here

导致内存泄漏。我做错了什么?

2 个答案:

答案 0 :(得分:0)

您的方法效率不高,因为每次用户滑动时都会创建每个位图。

您应该使用LruCache存储位图,这样您就不必重新创建已经解码过的位图。

答案 1 :(得分:0)

好的,我找到了添加这些内存泄漏的原因。这是因为我在views

中引用了PagerAdapter

您需要不参考views并实施destroyItem这样的

public void destroyItem (ViewGroup container, int position, Object object)
{
    ((ImageView)object).setImageResource(0);
    BitmapDrawable bmd = (BitmapDrawable) ((ImageView) object).getDrawable();
    if (bmd != null) bmd.getBitmap().recycle();
    View view = (View)object;
    ((ViewPager) container).removeView(view);
    view = null;
}