ViewPager读取本地图片

来源:互联网 发布:知乎怎么开通值乎 编辑:程序博客网 时间:2024/04/29 20:50

在网上看到了许多关于ViewPager的例子,但是大多数都是讲图片放到项目里面,而没有读取本地SD卡图片的例子,而我在最近做相册应用时候,正好用到

这个,再用ViewPager显示大图片的时候,总是遇到OOM异常,网上也没有什么解决方案,不过还好通过和别人交流找到了解决方案,给大家分享一下。

最开始我的代码ViewPager在加载1M以上的图片的时候,最多3张一定OOM,看一下代码

MyPagerAdapter

public class MyPagerAdapter extends PagerAdapter {Context mContext=null;ArrayList<String> image_url=null;Bitmap bitmap;ImageView imageView;private LayoutInflater inflater;    public MyPagerAdapter(Context context,ArrayList<String> image_url) {this.mContext=context;this.image_url=image_url;inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);}@Overridepublic int getCount() {// TODO Auto-generated method stubreturn image_url.size();}@Overridepublic boolean isViewFromObject(View arg0, Object arg1) {// TODO Auto-generated method stubreturn arg0==arg1;} @Overridepublic void destroyItem(View container, int arg1, Object arg2) {((ViewPager)container).removeView((View)arg2);    Log.d("ViewPager", "-<<销毁"+arg1+"页");}@Overridepublic void finishUpdate(View arg0) {// TODO Auto-generated method stub}@Overridepublic Object instantiateItem(View arg0, int arg1) { //     ImageView mGifView = new ImageView(mContext);//     try {//     bitmap=BitmapFac.decodeFile(image_url.get(position));//         mGifView.setImageBitmap(bitmap);//} catch (OutOfMemoryError e) {//e.printStackTrace();//}//     ((ViewPager) container).addView(mGifView,0);//    Log.i("Adapter", "instantiateItem:" + position);//     return mGifView; 
          注意看我给注释掉了这部分代码
 
    }@Overridepublic void restoreState(Parcelable arg0, ClassLoader arg1) {// TODO Auto-generated method stub}@Overridepublic Parcelable saveState() {// TODO Auto-generated method stubreturn null;}@Overridepublic void startUpdate(View arg0) {// TODO Auto-generated method stub}   }

image_url是我保存图片文件路径的方法,就是这BitmapFactory.decodeFile方法,这个方法是在底层以流的方式绘制出来的,内存消耗非常大。我们就要改变这个方法

不适用它

 

 ImageView mGifView = new ImageView(mContext);    try {     bitmap=ImageHelper.GetBitmap(image_url.get(position));        mGifView.setImageBitmap(bitmap);} catch (OutOfMemoryError e) {e.printStackTrace();}     ((ViewPager) container).addView(mGifView,0);    Log.i("Adapter", "instantiateItem:" + position);     return mGifView;



下面给出GetBitmap的代码

public static Bitmap GetBitmap(String filePath) {           FileInputStream fs = null;  try { BitmapFactory.Options opt = new BitmapFactory.Options();     // opt.inPreferredConfig = Bitmap.Config.RGB_565;        opt.inPurgeable = true;       opt.inInputShareable = true;       fs = new FileInputStream(filePath);       return BitmapFactory.decodeFileDescriptor(fs.getFD(), null, opt);  } catch (Exception e) {  e.printStackTrace();  } finally {      try {                fs.close();      } catch (Exception e) {          e.printStackTrace();      }  }  return null;  }


通过上面可以看出采用decodeFileDescriptor方法,这个方法通底层生成Bitmap,节省了很多内存。轻松解决了OOM问题,比较建议使用