1、UIL
详细使用参考这里 Android开源框架Universal-Image-Loader详解和Android-Universal-Image-Loader和Android-Universal-Image-Loader最新框架解析
这里只说一下注意事项:
1、ImageLoader是根据ImageView的height,width确定图片的宽高
2、在DisplayImageOptions中设置图片的缩放方式
imageScaleType(ImageScaleType.EXACTLY)
。。。
可以在Application里做一下初始化:
private void initImageLoader(Context context) {
mOptions = new DisplayImageOptions.Builder()
.showImageOnLoading(R.mipmap.ic_loading_large)//设置图片在下载期间显示的图片
.showImageForEmptyUri(R.mipmap.ic_loading_large)//设置图片Uri为空或是错误的时候显示
.showImageOnFail(R.mipmap.ic_loading_large) //设置图片加载/解码过程中错误时候显示的图片
.cacheOnDisk(true)//设置下载的图片是否缓存在内存中
.cacheInMemory(true)//设置下载的图片是否缓存在SD卡中
.imageScaleType(ImageScaleType.EXACTLY)//设置图片的缩放方式
.bitmapConfig(Bitmap.Config.RGB_565)//设置图片的解码类型
.build();
ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(context)
.threadPoolSize(2)// default 3 线程池内加载的数量
.threadPriority(Thread.MIN_PRIORITY) // default Thread.NORM_PRIORITYY - 2 设置当前线程的优先级
.denyCacheImageMultipleSizesInMemory()
.diskCacheFileNameGenerator(new Md5FileNameGenerator())// default为使用HASHCODE对UIL进行加密命名,
// 还可以用MD5(new Md5FileNameGenerator())加密,再保存的时候的URI名称用MD5 加密
.diskCacheSize(200 * 1024 * 1024) // 200 Mb
.memoryCache(new WeakMemoryCache())
.tasksProcessingOrder(QueueProcessingType.LIFO)
//.writeDebugLogs() // Remove for release app
.defaultDisplayImageOptions(mOptions)
.build();
// Initialize ImageLoader with configuration.
ImageLoader.getInstance().init(config);
}
3、设置滚动时不加载图片
- recycleview
- 重写onScrolled()方法,加载数据;
- 重写onScrollStateChanged()方法,在非IDLE状态下,停止加载图片;
- 使用 imageLoader.pause();暂停加载图片
@Override
public void onScrolled(int dx, int dy) {
int lastVisibleItem = ((LinearLayoutManager) getLayoutManager()).findLastVisibleItemPosition();
int totalItemCount = this.getAdapter().getItemCount();
//有回调接口,且不是加载状态,且计算后剩下2个item,且处于向下滑动,则自动加载
if (loadMoreListener != null && !isLoadingMore && lastVisibleItem >= totalItemCount -
2 && dy > 0) {
loadMoreListener.loadMore();
}
}
@Override
public void onScrollStateChanged(int state) {
if (imageLoader != null) {
switch (state) {
case SCROLL_STATE_IDLE:
imageLoader.resume();
break;
case SCROLL_STATE_DRAGGING:
if (pauseOnScroll) {
imageLoader.pause();
} else {
imageLoader.resume();
}
break;
case SCROLL_STATE_SETTLING:
if (pauseOnFling) {
imageLoader.pause();
} else {
imageLoader.resume();
}
break;
}
}
}
** 注:从别人那里看到的,链接找不到了。。。 **
- listview、gridview
- pauseOnScroll—是否在滑动过程中停止加载图片
- pauseOnFling—是否在快速猛的滑动中停止加载图片
listView.setOnScrollListener(new PauseOnScrollListener(imageLoader, pauseOnScroll, pauseOnFling));
gridView.setOnScrollListener(new PauseOnScrollListener(imageLoader, pauseOnScroll, pauseOnFling));
2、volley
为什么不用volley?
1、 没有实现暂停/重新加载图片
2、没有处理图片的exif信息
3、如果图片路径包含中文,会有问题(可以使用URLEncode.encode())
path.substring(0,p+1)+URLEncoder.encode(path.substring(p+1,path.length()), "utf-8")
4、没有glide方便