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

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

我想在 Android 上仅使用全屏图像进行图像幻灯片放映。没有缩略图(就像在图库中一样),没有缩放,没有收缩。只需左/右滑动即可从一张图片移动到另一张图片。

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

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

每次用户滑动到新的 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

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

最佳答案

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

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

关于java - Android幻灯片放映导致内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35395629/

相关文章:

android - 如何以编程方式检测口吃?

java - 在非 Android 应用程序上使用 LeakCanary

C++ 正确的内存释放没有关于分配的信息

Java : creating a directory fails

java - Java Tapestry 中的静态、非静态以及不同类之间的调用

android - 在不提交事务的情况下编辑 Realm 对象关系

c++ - 如何使用 Application Verifier 查找内存泄漏

java - 需要帮助分配并理解嵌套循环

java - Sybase 存储过程返回多结果集

android - 每天创建通知