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;
}
我想在 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;
}