Volley网络框架完全解析(实战篇)
好了,今天就通过一个瀑布流demo,来使用Volley框架请求网络图片。
前言:
我们使用NetworkImageView显示图片:
1、因为该控件可以自动的管理好请求的生命周期,当与父控件detach或者它移出屏幕时可以自动取消网络请求
2、该控件会根据我们所设置的NetworkImageView宽高来进行图片的压缩
3、该控件可以设置默认状态下显示的图片,可以设置在请求失败时候显示的图片
还用了ImageLoader来加载图片,使用ImageCache缓存来防止程序OOM,由于Volley自动会处理硬盘缓存,所以在没网情况下它还是能正常显示图片
好了,我先来看看效果吧:
由于gif上传大小限制,我就录了前一部分,我们从这部分的效果就可以看出,在加载图片时候,默认时会先显示我们设置的默认的图片,然后通过网络加载,再显示加载到的图片,因为ImageCache自动管理了内存缓存、而NetworkImageView又自动会根据它自身的宽高来压缩图片,所以即使图片数量多、图片大小比较大也可以很好的避免OOM。
下面我们打开缓存目录来看下缓存的文件:
现在我们把网络断开,来看看效果:
可以看到,在没有网络状态下,还是可以加载出图片,因为它会从缓存中取,即:
在没有网络的条件下会自动从缓存中取数据,在有网络的状态下,会先判断缓存中有没有该缓存文件,如有则取出,没有则开启网络请求获取,再存入硬盘缓存中。
好了,代码就贴个主要的:
RecyclerView适配器:
public class RecyclerAdapter extends RecyclerView.Adapter<RecyclerViewHolder> {
private Context mContext;
private List<String> datas;
private ImageLoader mImageLoader;
private BitmapCache mBitmapCache;
private List<Integer> heights;
public RecyclerAdapter(Context context, List<String> datas) {
this.mContext = context;
this.datas = datas;
getRandomHeights();
mBitmapCache = new BitmapCache();
mImageLoader = new ImageLoader(MyApplication.getRequestQueue(), mBitmapCache);
}
private void getRandomHeights() {
heights = new ArrayList<>();
for (int i = 0; i < datas.size(); i++) {
heights.add((int) (300 + Math.random() * 200));
}
}
@Override
public RecyclerViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(mContext).inflate(R.layout.layout_item, parent, false);
RecyclerViewHolder holder = new RecyclerViewHolder(view);
return holder;
}
@Override
public void onBindViewHolder(RecyclerViewHolder holder, int position) {
ViewGroup.LayoutParams params = holder.itemView.getLayoutParams();
params.height = heights.get(position);
holder.itemView.setLayoutParams(params);
holder.mNetworkImageView.setDefaultImageResId(R.mipmap.ic_crop_original_black_48dp);
holder.mNetworkImageView.setErrorImageResId(R.mipmap.ic_filter_hdr_black_48dp);
holder.mNetworkImageView.setImageUrl(datas.get(position), mImageLoader);
}
@Override
public int getItemCount() {
return datas.size();
}
}
BitmapCache代码:
public class BitmapCache implements ImageLoader.ImageCache {
private LruCache<String,Bitmap> mLruCache;
public BitmapCache(){
int maxMemory = (int) Runtime.getRuntime().maxMemory();
int maxCacheSize = maxMemory/8;
mLruCache = new LruCache<String,Bitmap>(maxCacheSize){
@Override
protected int sizeOf(String key, Bitmap value) {
return value.getByteCount();
}
};
}
@Override
public Bitmap getBitmap(String s) {
return mLruCache.get(s);
}
@Override
public void putBitmap(String s, Bitmap bitmap) {
mLruCache.put(s,bitmap);
}
}
Volley网络框架完全解析(实战篇)的更多相关文章
- Volley网络框架完全解析(缓存篇)
在上一篇中讲完了Volley框架怎么使用,那么这篇就来讲讲Volley框架的缓存机制 我们看Volley内部源码发现: Volley框架内部自己处理了DiskBasedCache硬盘缓存,但是没有处理 ...
- Volley网络框架完全解析(使用篇)
在Android中,网络请求无非就这两种:HttpURLConnection和HttpClient( Apache),我们在使用时一般都会对它们进行一系列的封装,但是这过程不免有些繁琐,所以,Goog ...
- 谷歌Volley网络框架讲解——BasicNetwork类
谷歌Volley网络框架讲解——BasicNetwork类 这个类是toolbox工具箱包里的,实现了Network接口. 先来看下Network这个interface,performRequest( ...
- 谷歌Volley网络框架讲解——第一篇
自从公司新招了几个android工程师后,我清闲了些许.于是就可以有时间写写博客,研究一些没来的研究的东西. 今年的谷歌IO大会上,谷歌推出了自己的网络框架——Volley.不久前就听说了但是没有cl ...
- Volley网络框架的使用
Volley的特点: 使用网络通信更快.更简单 Get/Post网络请求网络图像的高效率异步请求 可以对网络请求的优先级进行排序处理 可以进行网络请求的缓存 可以取消多级别请求 可以和Activi ...
- 谷歌Volley网络框架讲解——HttpStack及其实现类
前两篇已经对网络请求流程已经梳理了个大概,这次我们着重看一下HttpStack和它的其实现类.我们之前在Network篇讲过它仅有一个实现类,而今天我们讲的HttpStack有两个实现类. 其中Htt ...
- 谷歌Volley网络框架讲解——网络枢纽
研究了这么久的Volley,愈来愈发现这个框架的精美和人性化.比起民间一些框架强很多,一开始总是盲人摸象找不到头绪,现在终于有些明朗了.Volley其实就是一个请求队列的代理类,我们看下UML. 这就 ...
- 谷歌Volley网络框架讲解——Network及其实现类
我们看到Network接口只有一个实现类BasicNetwork,而HttpStack有两个实现类. BasicNetwork这个类是toolbox工具箱包里的,实现了Network接口. 先来看下N ...
- Android网络框架Volley(实战篇)
之前讲了ym—— Android网络框架Volley(体验篇),大家应该了解了volley的使用,接下来我们要看看如何把volley使用到实战项目里面,我们先考虑下一些问题: 从上一篇来看 mQu ...
随机推荐
- RxJava(五) onErrorResumeNext操作符实现app与服务器间token机制
欢迎转载,转载请标明出处: http://blog.csdn.net/johnny901114/article/details/51533586 本文出自:[余志强的博客] 一.需求场景: 在开发Ap ...
- [tornado]websocket 最简单demo
想法 前两天想看看django 长轮询或者是websocket的方案,发现都不太好使. tornado很适合做这个工作,于是找了些资料,参照了做了个最简单demo,以便备用. 具体的概念就不说了,to ...
- Spring的DataSource配置、将Hibernate配置全部写到Spring配置
DataSource可以集中管理数据库连接,减少维护工作量,使部署更简单: Spring的DataSource配置:(Spring数据源配置)这里使用dbcp,还有很多其他的如c3p0,jdbc,jn ...
- Android之触摸手势检测GestureDetector使用详解
在Android中,当用户触摸屏幕的时候,会产生许多手势,例如down,up,scroll,filing,onSingleTapConfirmed(单击),onDoubleTap(双击)等等. 一般情 ...
- JAVA面向对象-----extends关键字
继承使用extends关键字实现 1:发现学生是人,工人是人.显然属于is a 的关系,is a就是继承. 2:谁继承谁? 学生继承人,发现学生里的成员变量,姓名和年龄,人里边也都进行了定义.有重 复 ...
- Android实现系统下拉栏的消息提示——Notification
Android实现系统下拉栏的消息提示--Notification 系统默认样式 默认通知(通用) 效果图 按钮 <Button android:layout_width="match ...
- GDAL使用插件方式编译HDF4、HDF5以及NetCDF的bug修改
GDAL库中提供了很方便的插件机制来扩展支持的数据格式,比如HDF4.HDF5.NetCDF.FileGDB.Postgre.Oralce等等.都可以通过插件的方式来使得GDAL支持相应的格式.最近将 ...
- malloc、calloc、relloc
1.malloc void * malloc(size_t _Size); malloc函数在堆中分配参数_Size指定大小的内存,单位:字节,函数返回void *指针. 2.calloc void ...
- 使用JavaScript在Canvas上画出一片星空
随着Html5的迅猛发展,画布也变得越来越重要.下面我就写一个关于在canvas上画出一片星空的简单的代码的示例. 理论基础 初始化一个canvas,获得一个用于绘制图形的上下文环境context.并 ...
- UNIX网络编程——套接字选项(心跳检测、绑定地址复用)
/* 设置套接字选项周期性消息检测连通性 心跳包. 心博.主要用于长连接. * 参数:套接字, 1或0开启, 首次间隔时间, 两次间隔时间, 断开次数 */ void setKeepAlive( in ...