主流图片加载框架对比,及遇到的问题

来源:互联网 发布:少年班人物原型知乎 编辑:程序博客网 时间:2024/05/17 22:20
1、开源框架XUtils,参考http://blog.csdn.net/dj0379/article/details/38356773
XUtils框架中的BitmapUtils不能加载drawable中的图片,如果想加载可以参考https://github.com/nostra13/Android-Universal-Image-Loader控件中对drawable的处理。
可以参考文章http://www.07net01.com/2015/03/787393.html,它在加载相册图片时不会出现图片重复现象。
缓存采用的是LruDiskCache LruMemoryCache


2、开源框架Android-Universal-Image-Loader,参考http://blog.csdn.net/xiaanming/article/details/26810303
多线程下载图片,图片可以来源于网络,文件系统,项目文件夹assets中以及drawable中等
支持随意的配置ImageLoader,例如线程池,图片下载器,内存缓存策略,硬盘缓存策略,图片显示选项以及其他的一些配置
支持图片的内存缓存,文件系统缓存或者SD卡缓存
支持图片下载过程的监听
根据控件(ImageView)的大小对Bitmap进行裁剪,减少Bitmap占用过多的内存
较好的控制图片的加载过程,例如暂停图片加载,重新开始加载图片,一般使用在ListView,GridView中,滑动过程中暂停加载图片,停止滑动的时候去加载图片
提供在较慢的网络下对图片进行加载
/** * ImageLoader框架优化 * 1、加载列表时,避免重复创建DisplayImageOptions对象 * 2、图片类型设置为Bitmap.Config.RGB_565 * 3、图片缩放方式设置为ImageScaleType.IN_SAMPLE_INT * 4、内存缓存(cacheInMemory)设置为false * 5、内存缓存采用弱引用,可以采用LRULimitedMemoryCache,WeakMemoryCache不太稳定缓存的图片容易被回收掉 * 6、使用ImageViewAware,它将ImageView的强引用变成弱引用,当内存不足的时候,可以更好的回收ImageView对象 * 7、在滚动时不加载图片,setOnScrollListener(new PauseOnScrollListener(ImageLoader.getInstance(), true, false)), *    但是会出现图片错乱现象。 */





3、开源框架Picasso,参考 http://square.github.io/picasso/


这个仍然是Square的开源项目,Picasso是一个用于Android平台上的下载和缓存图片的项目。它有许多定制选项,如何处理下载图片(包括调整和裁剪,以及提供一个接口让你随自己心意将图片转换成圆角等)。Picasso将要下载的图片(如果没有缓存)并将它负载到指定的目标,转换图片以适合所显示的ImageView,来减少内存消耗。
1、可以快速加载本地图片,对所有图片的加载必须使用它,如果有的使用image.setImageResource,有的使用Picasso,加载图片时可能重复现象。PS:有三张图片,第一张用Picasso,后面用image.setImageResource方法就有可能出现图片重复现象。
加载图片效率高,可以参考http://blog.csdn.net/xu_fu/article/details/17043231
 Picasso.with(mContext)
             .load(new File(bean.name))
            .placeholder(R.drawable.default_error)
                     //.error(R.drawable.default_error)
             .resize(DensityUtil.dip2px(mContext, 80), DensityUtil.dip2px(mContext, 80))
             .centerCrop()
            .into(holder.iv_image);


4、Uri解析过程
//在加载相册图片时,对于一些网络图片名中有%号的,会将%25通过Uri解析成%,导致找不到图片
uri之前-/storage/emulated/0/CSDN/http%253A%252F%252Fimg.ask.csdn.net%252Fupload%252F201506%252F08%252F1433727012_994034.png
uri之后-/storage/emulated/0/CSDN/http%3A%2F%2Fimg.ask.csdn.net%2Fupload%2F201506%2F08%2F1433727012_994034.png
holder.iv_image.setImageURI(Uri.parse("file://"+path));


5、下面是项目中遇到读取本地图片和drawable图片
public View getView(int position, View convertView, ViewGroup parent) {....//设置gridview项宽度和高度一样if (convertView!=null) {convertView.setLayoutParams(new AbsListView.LayoutParams(itemWidth,itemWidth));}if (bean.id==-1) {//采用setImageResource结合Picasso或ImageLoader会出现图片重复现象,因此必须要统一//holder.iv_image.setImageResource(R.mipmap.send_photo);//Picasso.with(mContext).load(R.mipmap.send_photo).into(holder.iv_image);//ImageLoader.getInstance().displayImage( bean.name, new ImageViewAware(holder.iv_image));}else if(bean.id==-2){//holder.iv_image.setImageResource(R.mipmap.send_video);//Picasso.with(mContext).load(R.mipmap.send_video).into(holder.iv_image);//ImageLoader.getInstance().displayImage( bean.name, new ImageViewAware(holder.iv_image));}else {//          1、使用这种方法,没有缓存策略,加载速度很慢//holder.iv_image.setImageBitmap(decodeFile(bean.name,itemWidth,itemWidth));//2、对含有%名字的图片可能加载不到,同1//holder.iv_image.setImageURI(Uri.parse("file:/"+bean.name));//3、开源框架 //mBitmapUtils.display(holder.iv_image, bean.name);//4、开源框架 Picasso   Picasso.with(mContext)           .load(new File(bean.name))           .placeholder(R.drawable.default_error)           .resize(itemWidth, itemWidth)           .centerCrop()           .into(holder.iv_image);//5、开源框架//ImageLoader.getInstance().displayImage("file:/"+bean.name, new ImageViewAware(holder.iv_image));}return convertView;}//通过下面的方法来进行加载图片时,同时加载九张图片(2-3M)时需要2秒时间,其中宽度和高度都是手机屏幕宽度的1/3.    private Bitmap decodeFile(String path, int viewWidth, int viewHeight){          BitmapFactory.Options options = new BitmapFactory.Options();          //设置为true,表示解析Bitmap对象,该对象不占内存          options.inJustDecodeBounds = true;          BitmapFactory.decodeFile(path, options);          //设置缩放比例          options.inSampleSize = computeScale(options, viewWidth, viewHeight);           System.out.println("---------------+"+options.inSampleSize);        //设置为false,解析Bitmap对象加入到内存中          options.inJustDecodeBounds = false;                    return BitmapFactory.decodeFile(path, options);      }  private int computeScale(BitmapFactory.Options options, int viewWidth, int viewHeight){          int inSampleSize = 1;          if(viewWidth == 0 || viewWidth == 0){              return inSampleSize;          }          int bitmapWidth = options.outWidth;          int bitmapHeight = options.outHeight;                 if(bitmapWidth > viewWidth || bitmapHeight > viewWidth){              int widthScale = Math.round((float) bitmapWidth / (float) viewWidth);              int heightScale = Math.round((float) bitmapHeight / (float) viewWidth);                         inSampleSize = widthScale < heightScale ? widthScale : heightScale;          }          return inSampleSize;      }  

0 0
原创粉丝点击