现阶段有很多非常流行的图片加载框架,比如UIL,Picasso,Glide,Fresco等等,下面就主要介绍一下UIL.
一.首先说一下UIL(Universal-Image-Loader)的缓存处理机制(个人理解),如下图
① UI:请求数据,使用唯一的Key值索引Memory Cache中的Bitmap。
② 内存缓存:缓存搜索,如果能找到Key值对应的Bitmap,则返回数据。否则执行第三步。
③ 硬盘存储:使用唯一Key值对应的文件名,检索SDCard上的文件。
④ 如果有对应文件,使用BitmapFactory.decode*方法,解码Bitmap并返回数据,同时将数据写入缓存。如果没有对应文件,执行第五步。
⑤ 下载图片:启动异步线程,从数据源下载数据(Web)。
⑥ 若下载成功,将数据同时写入硬盘和缓存,并将Bitmap显示在UI中。
二.使用步骤:
1.首先下载jar包,下载地址:
https://github.com/nostra13/Android-Universal-Image-Loader
导入到项目的lib文件夹下,
或者在as中添加依赖
compile '
com.nostra13.universalimageloader:universal-image-loader:1.9.5'
2.导到项目中后需要进行初始化(官方在application中进行),直接上代码:
File cacheDir = StorageUtils.getOwnCacheDirectory(context, "imageloader/Cache");
ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(context)
// max width, max height,即保存的每个缓存文件的最大长宽
.memoryCacheExtraOptions(480, 800)
//线程池内加载的数量
.threadPoolSize(3)
.threadPriority(Thread.NORM_PRIORITY - 2)
.denyCacheImageMultipleSizesInMemory()
//将保存的时候的URI名称用MD5 加密
.diskCacheFileNameGenerator(new Md5FileNameGenerator())
// 你可以通过自己的内存缓存实现
.memoryCache(new UsingFreqLimitedMemoryCache(2 * 1024 * 1024))
// 内存缓存的最大值
.memoryCacheSize(2 * 1024 * 1024)
// 50 Mb sd卡(本地)缓存的最大值
.diskCacheSize(50 * 1024 * 1024)
.tasksProcessingOrder(QueueProcessingType.LIFO)
// 自定义缓存路径由,原先的discCache -> diskCache
.diskCache(new UnlimitedDiskCache(cacheDir))
// connectTimeout (5 s), readTimeout (30 s)超时时间
.imageDownloader(new BaseImageDownloader(context, 5 * 1000, 30 * 1000))
.writeDebugLogs() // Remove for release app
.build();
//全局初始化此配置
ImageLoader.getInstance().init(config);
3.在加载图片的代码中进行使用:
ImageLoader imageLoader = ImageLoader.getInstance();//得到单例
DisplayImageOptions options = new DisplayImageOptions.Builder()
.showImageForEmptyUri(R.mipmap.ic_launcher)//占位显示图片
.showImageOnFail(R.mipmap.ic_launcher)//加载失败显示图片
.showImageOnLoading(R.mipmap.ic_launcher)//加载中显示图片
.cacheInMemory(true)//缓存到内存
.cacheOnDisk(true)//缓存到磁盘
.bitmapConfig(Bitmap.Config.RGB_565)
.build();
最关键的一步就是使用 displayImage 方法,将图片显示到相应的UI控件上
imageLoader.displayImage(imgurl,imageview,option);
说明一下:imgurl是图片地址,
imageview是显示图片的控件,
option显示配置,已经在上面配置.
必须注意的是加权限,加权限,加权限!
android.permission.INTERNET
android.permission.WRITE_EXTERNAL_STORAGE
到这里就完成了,运行就可以看效果了!
希望对新手能有所帮助,也希望大神能指点下。