关闭

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

标签: 图片框架内存uri
1069人阅读 评论(0) 收藏 举报
分类:
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

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:305554次
    • 积分:6182
    • 等级:
    • 排名:第4427名
    • 原创:297篇
    • 转载:108篇
    • 译文:1篇
    • 评论:21条
    最新评论