Android 幻灯片放映导致内存泄漏

Android slideshow leads to Memory leaks

我想在 Android 上做一个只有全屏图像的图像幻灯片。没有缩略图(就像在图库中一样),没有缩放,没有收缩。仅 left/right 滑动即可从一张图片移动到另一张图片。

图片保存在数据文件夹中,共有~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.But 使用的内存

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

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

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

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

中引用了 views

您不需要参考 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;
}