我在我的应用中使用ViewPager
来显示图片(来自相机等,所以它可以是大图片)。我还使用Glide library
将图片从Uri
加载到ImageView
。这是我的PagerAdapter
:
public class GalleryPagerAdapter extends PagerAdapter {
private List<FileMetaData> mPhotos = null;
private Context _context;
private LayoutInflater _inflater;
public GalleryPagerAdapter(Context context, List<FileMetaData> files) {
_context = context;
mPhotos = files;
_inflater = (LayoutInflater) _context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
@Override
public boolean isViewFromObject(View view, Object object) {
return view == ((ImageView) object);
}
@Override
public int getCount() {
return mPhotos.size();
}
@Override
public Object instantiateItem(ViewGroup container, final int position) {
View itemView = _inflater.inflate(R.layout.photo_pager_item, container, false);
container.addView(itemView);
ImageView imageView = (ImageView) itemView.findViewById(R.id.imageViewPhotoDetail);
Glide.with(_context).load(mPhotos.get(position).getUri()).placeholder(R.drawable.placeholder_image)
/*.skipMemoryCache(true).*/.diskCacheStrategy(DiskCacheStrategy.NONE).into(imageView);
return itemView;
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
ImageView i = (ImageView) object;
container.removeView(i);
}
}
布局photo_pager_item
很简单:
<ImageView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/imageViewPhotoDetail"
android:layout_width="match_parent"
android:layout_height="match_parent" />
并且setOffscreenPageLimit
设置为1(默认情况下)。我的问题是我得到了OutOfMemory Exception
。但我不知道如何解决它。我应该改变什么?如何回收Glide加载的图像?我需要让它在电视上播放(大屏幕)。
答案 0 :(得分:0)
我的问题是我得到OutOfMemory Exception。但我不知道 如何解决它。我应该改变什么?如何回收加载的图像 通过Glide?我需要让它在电视上播放(大屏幕)。
您的实施没有任何问题。如果你得到OutOfMemory Exception
这通常是在你的内存缓冲区大小变满时,如果你在内存不足的设备中显示大尺寸图像,请说明。
可能的解决方案可以是:
1。正如您所说,您正在从网址加载图片视图。为480 * 800的设备下载1080 * 1920尺寸的图像不是正确的方法。所以,尝试在你的后端制作几个图像,如小(300 * 300),中(500 * 500),大(1000 * 1000),原(XXX * XXX)
后续,根据设备的当前分辨率从网址获取适当的图像。
2. 如果您的图片没有透明度,请尝试使用 JPEG 文件而不是 PNG
显然,您需要做一些额外的努力,但这有助于您最大限度地减少“OutOfMemory异常”。但是,在此之后,还有许多场景,因此您可以面对此异常。
我希望它会对你有所帮助。
答案 1 :(得分:0)
在分析应用程序后,我使用上述方法发现了内存泄漏。这对我使用Glide和viewpager起作用了:
Glide.with(context)
.load(imageURL))
.asBitmap()
.dontAnimate()
.diskCacheStrategy(DiskCacheStrategy.RESULT)
.into(new SimpleTarget<Bitmap>() {
@Override
public void onResourceReady(Bitmap bitmap, GlideAnimation anim) {
if (bitmap != null) {
imageView.setImageDrawable(bitmap);
}
}
});