volley 框架剖析(三) Request类精解

Request是所有网络请求的基类,它实现了Comparable接口,前面提到RequestQueue可按照优先级队进行排序,这里的Comparable就是为优先级排序作准备。

接下来,我们对Request中比较重要或有趣的成员或方法进行一一解释。

Request中包括一个对支持的Http方法的定义。这里使用的内部接口而不是枚举来实现的。

 public interface Method {
        int DEPRECATED_GET_OR_POST = -1;
        int GET = 0;
        int POST = 1;
        int PUT = 2;
        int DELETE = 3;
        int HEAD = 4;
        int OPTIONS = 5;
        int TRACE = 6;
        int PATCH = 7;
    }

Volley的日志记录是相关完善的,在定义日志系的时候也有一个小技巧值得我们学习,即在创建对象的时候就判断需要不需要日志,如果不需要日志,则不创建。

private final MarkerLog mEventLog = MarkerLog.ENABLED ? new MarkerLog() : null;

mIdentifier是唯一标识符,它的生成是在构造函数中调用createIdentifier方法。其算法是由Http方法,URL,当前系统时间以及内部计数器串起来的字符串,然后计算的一个Sha1。

不过我觉得这里的算法不是线程安全的,有可能会产生相同的ID。

private String mIdentifier;
private static String createIdentifier(final int method, final String url) {
        return InternalUtils.sha1Hash("Request:" + method + ":" + url +
                ":" + System.currentTimeMillis() + ":" + (sCounter++));
}

一般网络都需要重试,这里它定义了 一个重试策略。

private RetryPolicy mRetryPolicy;

在volley的设计中这个重试策略的用法是如果抛出VolleyError则不再重试,否则,就会重试。这个重试的机制是由BasicNetwork中的while(true)这个死循环来处理。

它有一个默认实现类DefaultRetryPolicy,实现得比较简单,只是做了一个次数的重试,且只重试一次。但我们看到,DefaultRetryPolicy中还是埋下了一些伏笔。比如,后退因子mBackoffMultiplier,以及超时等待。也就是说,我们在丰富这个重试策略的时候,也可以做成等待多久后,再试一次。

比如下面的代码实现的就是在重试前先等待一段时间,再试。这一段时间就是由mCurrentTimeoutMs来决定。

/**
 * Created by Rex on 4/26/2015.
 */
public class WaitRetryPolicy extends DefaultRetryPolicy {

    @Override
    public void retry(VolleyError error) throws VolleyError {
        try {
            Thread.sleep(getCurrentTimeout());
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        super.retry(error);
    }
}

此外,我们注意到有以几个成员:

   // A cheap variant of request tracing used to dump slow requests.
    private long mRequestBirthTime = 0;

    /** Threshold at which we should log the request (even when debug logging is not enabled). */
    private static final long SLOW_REQUEST_THRESHOLD_MS = 3000;

在finish方法中,有这么一段,

 long requestTime = SystemClock.elapsedRealtime() - mRequestBirthTime;
            if (requestTime >= SLOW_REQUEST_THRESHOLD_MS) {
                VolleyLog.d("%d ms: %s", requestTime, this.toString());
            }

做什么用呢?当volley发现一个请求的开销超出某个阈值(SLOW_REQUEST_THRESHOLD_MS)时,则不管是不是log开关有没有打开,都会打印一个调试日志,用于尽快的跟踪问题。这个习惯相当的好。

另外,我们注意到,它计时所用的方法是 SystemClock.elapsedRealtime(),而不是System.currentTimeMillis()。 这两个方法有啥区别呢?区别在于currentTimeMillis用户可以更改,即当修改用户时间这个值会变,而前者则是开机后的绝对流逝时间,是无法手动去修改这个值的。因此,使用SystemClock.elapsedRealtime()会非常确准的计算时间差。

volley还有一个特点是,我们注意下这些Set方法。

大多数时候,他们都有一个返回值,return this. 这种写法能够很方便的把各个赋值语句串起来(像builder模式),让调用者非常舒服的使用代码。

总之,这个Request类在写法上考虑了很多的细节,同时又有一些技巧,这些都值得我们学习。

时间: 2024-10-05 22:10:12

volley 框架剖析(三) Request类精解的相关文章

volley 框架剖析(一) 面向接口的编程

Volley是Google出品的一个轻量级的网络框架,默认实现,主要用于小数据量的网络请求.这里就按从粗到细,自上而下的过程,给大家剖析这个牛X的框架. 这个框架的代码量虽少,但却把面向接口的编程这个原则发挥的淋漓尽致.这个框架是怎么构成的呢? 先看包的结构. 有com.android.volley 及 com.android.volley.toolbox两个包. 其中com.android.volley中的接口和类,是基础框架,构成了一个基于队列的网络请求功能. 而com.android.vo

Volley框架剖析( 二)从开始到结束

上一篇中,我们分析了Volley的一个总体组成.今天我们继续分析Volley的一个数据流走向,即从初始化到发起请求,再到请求结束的一个流程. 先看初始化. Volley的初始化,实际上就是返回一个RequestQueue的队列.在Volley中调用.一个最简单的创建方式即有一个Context即可. /** * Creates a default instance of the worker pool and calls {@link RequestQueue#start()} on it. *

volley 框架剖析(四) 之HTTPCache设计

记得有位高人说过,成功在于细节.同样,一份代码质量如何,同样也在于对细节的处理上.考虑的情况越多,则出现问题的概率也就越低. Cache之前也写过,但看了Volley的Cache之后,真心觉得差距大了.不废话了,还是上大餐吧 public static class Entry { /** The data returned from cache. */ public byte[] data; /** ETag for cache coherency. */ public String etag;

Java-WebSocket 项目的研究(三) WebSocketClient 类 详解

通过之前两篇文章 Java-WebSocket 项目的研究(一) Java-WebSocket类图描述 Java-WebSocket 项目的研究(二) 小试身手:客户端连接服务器并发送消息实例 的介绍我们大概了解到了整个项目的类结构,其中有一个重要的类:WebSocketClient,下面就让我们详细了解一下这个类 首先看一下我们之前的类图关于WebSocketClient的描述,可以看出: 1.继承自WebSocketAdapter 2.依赖于类WebSocketImpl(实际上关于WebSo

从源码角度 解决Volley框架乱码的问题

用Volley框架,解析json 发现了乱码问题.但是服务器的有不愿 意改,只能看源码改了. Volley框架有三个方法 StringRequest; JsonArrayRequest JsonObjectRequest 发下他们分别都是继承了JsonRequest 类 然后呢我们又发现 JsonRequest 类 前面有abstract 是抽象的 惯性思想就是 三个集成一个抽象类 那么三个肯定有类似的方法 结果发现了唯一的抽象类是这个 parseNetworkResponse(NetworkR

Android网络通信Volley框架源码浅析(三)

尊重原创 http://write.blog.csdn.net/postedit/26002961 通过前面浅析(一)和浅析(二)的分析,相信大家对于Volley有了初步的认识,但是如果想更深入的理解,还需要靠大家多多看源码. 这篇文章中我们主要来研究一下使用Volley框架请求大量图片的原理,在Android的应用中,通过http请求获取的数据主要有三类: 1.json 2.xml 3.Image 其中json和xml的获取其实原理很简单,使用Volley获取感觉有点大财小用了,了解Volle

android Volley 框架详解

开发android应用很多时候都要涉及网络操作,Android SDK中提供了HttpClient 和 HttpUrlConnection两种方式用来处理网络操作,但当应用比较复杂的时候需要我们编写大量的代码处理很多东西:图像缓存,请求的调度等等: 而Volley框架就是为解决这些而生的,它与2013年Google I/O大会上被提出:使得Android应用网络操作更方便更快捷:抽象了底层Http Client等实现的细节,让开发者更专注与产生RESTful Request.另外,Volley在

Volley框架的原理剖析-->

Volley的主要特点: 1.扩展性强.Volley中大多数都是基于接口的设计,可配置性强. 2.一定程度符合Http规范,包括返回ResponseCode的处理,请求头的处理,缓存机制的支持等.并支持重试及优先级定义. 3.默认Android2.3及以上基于HttpURLConnection,2.3以下基于HttpCllient. 4.提供简便的图片加载工具. Volley主要是通过两种Dispatch Thread不断从RequestQueue中取出请求,根据是否已缓存调用Cache或Net

Volley网络请求框架简析——Android网络请求框架(三)

题记-- 人来到这个世界上,只有两件事情,生与死, 一件事完了,另一件事还急什么? 有缘而来,无缘而去, 识自本心,见自本性 不起妄缘,无心无为 自由自在,动静自如 冷暖自知,则是修行 1.初始化一个消息请求队列以及网络请求工具类对象 /** * Created by androidlongs on 16/7/1. * 网络请求访问框架 */ public class VollyRequestUtils { /** * Volley框架使用工具类对象 */ private static Voll