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 ...
随机推荐
- SQLite Insert 语句(http://www.w3cschool.cc/sqlite/sqlite-insert.html)
SQLite Insert 语句 SQLite 的 INSERT INTO 语句用于向数据库的某个表中添加新的数据行. 语法 INSERT INTO 语句有两种基本语法,如下所示: INSERT IN ...
- maven配置详解
什么是pom? pom作为项目对象模型.通过xml表示maven项目,使用pom.xml来实现.主要描述了项目:包括配置文件:开发者需要遵循的规则,缺陷管理系统,组织和licenses,项目的 ...
- XMPP(三)-安卓即时通讯客户端
由于时间原因,所以更新比较慢 ,还请大家谅解,此次是对上篇文章中的安卓客户端初级版本进行的一次更新优化,在这次更新后,就有那么一点样子了,可以拿的出手了,呵呵,还在关注的同学也可以及时下载更新.此次主 ...
- 20 ViewPager Demo3指示器
MainActivity.java package com.qf.day20_viewpager_demo3; import java.util.ArrayList; import java.util ...
- Dynamics CRM2015 页面导航栏顶部全局快速查找功能配置
在CRM2015中微软加入了新的快速查找功能,让你的数据查找更加方便,功能栏如下图所示,直接可以框中输入搜索项进行搜索. 但该功能是需要进行些配置,具体的配置在设置-管理-系统设置中,默认的就是红框中 ...
- 多线程之Java线程阻塞与唤醒
线程的阻塞和唤醒在多线程并发过程中是一个关键点,当线程数量达到很大的数量级时,并发可能带来很多隐蔽的问题.如何正确暂停一个线程,暂停后又如何在一个要求的时间点恢复,这些都需要仔细考虑的细节.在Java ...
- Django 实现简单的文件上传
今天分享一下Django实现的简单的文件上传的小例子. 步骤 创建Django项目,创建Django应用 设计模型 处理urls.py 以及views.py 设计模板,设计表单 运行项目,查看数据库 ...
- lager_transform未定义错误
lager_transform未定义错误rebar编译时报错:D:\server\six>d:/tools/rebar/rebar.cmd compile==> mysql (compil ...
- XML命名规则
XML = Extensible Markup Language,可扩展标记语言 XML 标签对大小写敏感,XML 标签对大小写敏感.在XML 中,标签 <Letter> 与标签 < ...
- Dynamics CRM Import Solution Attribute Display Name description is null or empty
在做解决方案导入的时候遇到错误,下载错误xml信息后查询报错如下:"Attribute Display Name description is null or empty",字面意 ...