Android ViewPager - 使用Glide的OutOfMemory异常(在手机和电视上)

时间:2016-03-02 10:19:23

标签: android android-viewpager fragmentpageradapter android-pageradapter android-glide

我在我的应用中使用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加载的图像?我需要让它在电视上播放(大屏幕)。

2 个答案:

答案 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);

                            }
                        }
                    });