我想在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使用的内存。但是当我看看我的记忆职业时
导致内存泄漏。我做错了什么?
答案 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;
}