Volley简介(四)
先看下整体结构:
从上面的结构中,可以看出。当请求队列中的请求出列,会先在在缓存调度中中查找是否该url地址被执行过,如果是的话就在缓存中读取,否则就网络线程中执行请求。
那么下面来看下Volley类:
这个类是个静态类,主要是起到初始化网络线程,请求队列的作用。
构造方法中里面有两个参数,一个Network,一个是RequestQueue。主要的要点可以参考上面的图形。
/*** Creates a default instance of the worker pool and calls {@link RequestQueue#start()} on it.** @param context A {@link Context} to use for creating the cache dir.* @param stack An {@link HttpStack} to use for the network, or null for default.* @return A started {@link RequestQueue} instance.*/public static RequestQueue newRequestQueue(Context context, HttpStack stack) {File cacheDir = new File(context.getCacheDir(), DEFAULT_CACHE_DIR);String userAgent = "volley/0";try {String packageName = context.getPackageName();PackageInfo info = context.getPackageManager().getPackageInfo(packageName, 0);userAgent = packageName + "/" + info.versionCode;} catch (NameNotFoundException e) {}if (stack == null) {if (Build.VERSION.SDK_INT >= 9) {stack = new HurlStack();} else {// Prior to Gingerbread, HttpUrlConnection was unreliable.// See: http://android-developers.blogspot.com/2011/09/androids-http-clients.htmlstack = new HttpClientStack(AndroidHttpClient.newInstance(userAgent));}}Network network = new BasicNetwork(stack);RequestQueue queue = new RequestQueue(new DiskBasedCache(cacheDir), network);queue.start();return queue;}
在Network的对网络请求的实现:
static HttpUriRequest createHttpRequest(Request<?> request,Map<String, String> additionalHeaders) throws AuthFailureError {switch (request.getMethod()) {case Method.DEPRECATED_GET_OR_POST: {// This is the deprecated way that needs to be handled for backwards compatibility.// If the request's post body is null, then the assumption is that the request is// GET. Otherwise, it is assumed that the request is a POST.byte[] postBody = request.getPostBody();if (postBody != null) {HttpPost postRequest = new HttpPost(request.getUrl());postRequest.addHeader(HEADER_CONTENT_TYPE, request.getPostBodyContentType());HttpEntity entity;entity = new ByteArrayEntity(postBody);postRequest.setEntity(entity);return postRequest;} else {return new HttpGet(request.getUrl());}}case Method.GET:return new HttpGet(request.getUrl());case Method.DELETE:return new HttpDelete(request.getUrl());case Method.POST: {HttpPost postRequest = new HttpPost(request.getUrl());postRequest.addHeader(HEADER_CONTENT_TYPE, request.getBodyContentType());setEntityIfNonEmptyBody(postRequest, request);return postRequest;}case Method.PUT: {HttpPut putRequest = new HttpPut(request.getUrl());putRequest.addHeader(HEADER_CONTENT_TYPE, request.getBodyContentType());setEntityIfNonEmptyBody(putRequest, request);return putRequest;}case Method.HEAD:return new HttpHead(request.getUrl());case Method.OPTIONS:return new HttpOptions(request.getUrl());case Method.TRACE:return new HttpTrace(request.getUrl());case Method.PATCH: {HttpPatch patchRequest = new HttpPatch(request.getUrl());patchRequest.addHeader(HEADER_CONTENT_TYPE, request.getBodyContentType());setEntityIfNonEmptyBody(patchRequest, request);return patchRequest;}default:throw new IllegalStateException("Unknown request method.");}}
Request:
作为数据传送,处理和接受的工厂,都是要通过它来将来往的数据联系起来的。是所有请求的原型,StringRequest,ImageRequest等都是它的子类。
队列的start()方法:
/*** Starts the dispatchers in this queue.*/public void start() {stop(); // Make sure any currently running dispatchers are stopped.// Create the cache dispatcher and start it.mCacheDispatcher = new CacheDispatcher(mCacheQueue, mNetworkQueue, mCache, mDelivery);mCacheDispatcher.start();// Create network dispatchers (and corresponding threads) up to the pool size.for (int i = 0; i < mDispatchers.length; i++) {NetworkDispatcher networkDispatcher = new NetworkDispatcher(mNetworkQueue, mNetwork,mCache, mDelivery);mDispatchers[i] = networkDispatcher;networkDispatcher.start();}}
其实质,是开启多个线程来出来:
public class CacheDispatcher extends Thread {
public class NetworkDispatcher extends Thread {
ImageLoader:
这个工具类是用来进行进行批量的图像处理的,在listview中进行多项图像请求,就要使用到它。
监听图像响应:
public static ImageListener getImageListener(final ImageView view,final int defaultImageResId, final int errorImageResId) {return new ImageListener() {@Overridepublic void onErrorResponse(VolleyError error) {if (errorImageResId != 0) {view.setImageResource(errorImageResId);}}@Overridepublic void onResponse(ImageContainer response, boolean isImmediate) {if (response.getBitmap() != null) {view.setImageBitmap(response.getBitmap());} else if (defaultImageResId != 0) {view.setImageResource(defaultImageResId);}}};}
好了,大概相关的就介绍到这吧,有兴趣的童鞋,可以深入的研究下!
Volley简介(四)相关推荐
- 哈工程计算机学院研究生导师,哈尔滨工程大学自动化研究生导师简介四.doc
哈尔滨工程大学自动化研究生导师简介 四 ? 莫宏伟男,1973年5月生,工学博士,教授,博士生导师 模式识别与智能系统研究所副所长 指导博士生学科:模式识别与智能系统 指导硕士生学科:第一专业:模式识 ...
- Android 网络通信框架Volley简介(Google IO 2013)
Volley主页 https://android.googlesource.com/platform/frameworks/volley http://www.youtube.com/watch?v= ...
- 仿新浪微盾客户端项目简介四
上节我们说到我们主要的算法是在Google的一个开源项目Google Authenticator 修改的.那么我们窥探一下Google Authenticator的全貌. 我们通过源代码来了解,上代码 ...
- Volley简介(三)
自定义Request: 我们先看下Request,是所有网络请求的基类. 支持的请求方式,包含post,get等请求方式,在定义请求方式中可以自己设定. /*** Supported request ...
- Volley简介(一)
源码下载地址 特点: 1.json,图片等的异步下载. 2.网络请求排序. 3.网络请求的优先处理. 4.缓存. 5.多级别取消请求. 6.和Activity和生命周期的联动(Activity结束时同 ...
- Volley简介(二)
NetWorkImageView: Volley提供的图像组件,其父类是ImageView,在里面可以通过url处理获取的图像及请求的生命周期. 添加到布局中: <com.android.vol ...
- 初识Volley(四)
main界面视图: 1.JsonRequest 没有有效的json地址,找了google的,400,请替换有效json地址就OK 2.使用的NetWorkImageView 3.使用的ImageR ...
- MEF 基础简介 四
前言 前面讲解了MEF的引用方法,接口的导入导出,类属性的导入导出和集合的导出用法其实大家可以看到基本上大同小异的. MEF的延迟加载 我们知道当装配一个组件的时候,当前组件里面的所有的Import的 ...
- Android网络编程五:(1)Volley简介
转载自:http://blog.csdn.net/t12x3456/article/details/9221611 1. 什么是Volley 在这之前,我们在程序中需要和网络通信的时候,大体使用的东西 ...
最新文章
- 把PPT做漂亮点真的有用,研究证明图表美观增加可信度,作者:还会影响论文引用和通过率...
- WebApi接口安全认证——HTTP之摘要认证
- LetCode: 5. 最长回文子串
- 第一次能够在电影开场前20分钟到的经历:感谢滴答清单
- 软件工程—让软件包自带commit id
- java解码p7b证书文件,通过OpenSSL解码X509证书文件
- SqlServer中dateTime、dateTime2、date、datetimeoffset的区别
- ShadeGraph教程之节点详解4:Master Nodes
- MATLAB程序实验3,实验3_matlab程序设计实验.doc
- PS打造油画般的风景人像
- layUI table 按条件搜索 结果整个页面刷新
- Git简洁教程:本地项目如何与GitHub互连
- IntelliJ IDEA 记学习笔《装阿里代码规范插件》
- CAD中插入外部参照字体会变繁体_打开CAD图纸发现图形丢失,原来是大意了,四招解决...
- 深入理解计算机系统bomb实验
- 为什么使用阿里普惠体没效果
- 微信小程序云开发体会——总结软件工程导论大作业
- Windows 11 下 Virtualbox 6.1.34 出现 End kernel panic - not syncing: attempted to kill the idle task
- SAP 消息号 F5113 科目确认没有对交易. SKE (在会计科目表 XXXX 中)定义
- 机器学习面试必考面试题汇总—附解析
热门文章
- 3、孟子·滕文公上 孟子·滕文公下
- 分类——逻辑回归Python实现
- 最实用的免费思维导图软件哪个最好用、用户最多
- 封装格式分析-MP4
- [部分学校JAVAmooc答题解答] 16版.统计年龄
- Java泛型(11):潜在类型机制
- 20211013学习总结
- Android WebView 优化、WebV离线包开发出现Crash: Fatal signal 5 , code 1, fault addr 0x6e1f33c798 in tid 32217
- 【Linux】-- 进程间通讯
- 嵌入式Linux跑分软件,看看你的嵌入式设备CPU温度是多少,能烤肉吗?