Volley学习记录

当你替换一个框架、使用一个框架的理由是什么呢?做了哪些准备和调研

性能上的优化
使用场景:
用retrofit来提高性能
Retrofit的高度封装和注解可以大大简化代码
AsyncTasks在多任务的时候表现乏力,速度慢。
包的体积

优点

  • 可直接在主线程调用服务端并处理返回结果。
  • 可以取消请求,容易扩展,面向接口编程。
  • 通过使用标准的HTTP缓存机制保持磁盘和内存响应的一致
  • 支持请求优先级
  • 支持取消请求
  • 可以根据手机CPU调整调度器的个数

缺点

  • volley不适合上传下载大量文件,volley的request和response都是把数据放到byte数组里,不支持输入输出流。
  • 特别适合数据量小,通信频繁的网络操作。
  • 只支持https请求
  • 不支持401错误码。只考虑了statusCode(statusCode < 200 || statusCode > 299的情况。
功能点:
  • 取消请求机制

  • 取消队列机制

  • 缓存机制

  • 异常处理机制

  • 网络请求数据处理流程

  • 异常处理流程

  • Request类:
    1、分装请求参数
    2、封装结果回调监听(Listener)
    3、不同的Request子类类型重写解析函数,解析请求后的数据,
    4、把解析后的数据分发给Listener。
    5、优先级通过内部枚举Priority来定义
    6、是否缓存开关
    7、Request中的请求优先级机制:
    在Request对象加入到请求列队的时候会给Request对象设置一个squence序列号,通过AtomicInteger.incrementAndGet()来获取,然后加入到PriorityBlockingQueue,在加入的时候PriorityBlockingQueue会对实现了Compare接口的对象排序,Request实现了Compare接口,在Request的compareTo方法中的比较方式有两种,首先根据对Request设置的枚举Priority来判断,如果相等的话,就根据squence序列号来定义优先级规则
    8、重试策略RetryPolicy

  • NetworkDispathcer
    顾名思义“网络调度器”,Thread的子类,在RequestQueue创建的时候被创建,在RequestQueue的一个线程数组中存起来,然后全部初始化运行,在每个调度去的run()里面死循环从请求队列里面去取,如果队列没有数据就阻塞。
    干的事情:
    1、死循环从请求队列取东西。
    2、在请求之前request.isCanceled()检查request是否被取消。
    3、可以调用quit()方法退出调度器,中断线程。
    4、mNetwork.performRequest执行“真正的请求”返回NetworkResponse
    5、把NetworkResponse丢给Request去解析,这里给Request解析的好处是根据不同的Requsest返回不同类型的数据
    6、是否需要缓存
    7、mDelivery进行回调分发

  • Respose
    存储返回的结果、以及Request解析的数据类型。

  • NetworkResponse
    用来包装网络请求后的数据
    public final int statusCode;//用来保存返回码
    public final byte[] data;//保存服务器返回的二进制数据,这也是为什么不能下载大数据的原因,把数据都缓存在了数组。
    public final Map header;//存放返回相应头
    public final boolean notModified;//是否被修改
    public final long networkTimeMs;//响应时间

  • Cache、Cache.Entry
    用来包装缓存的数据

  • HurlStack实行真正的请求,volley要实行高扩展很多都是对这个类进行的。
    1、UrlRewriter对url进行进一步的改造,这个类可以通过HurlStack的构造传递进来,在volley初始化的时候进行扩展。还可以定义SSLSocketFactory对https进行支持。
    2、openConnection()方法放回HttpURLConnection对象,是一个工厂方法,可以重写这个方法对Okhttp进行扩展。

  • HttpResponse、HttpResponse.HttpEntity
    这里用了apache的包,HttpResponse分装了请求的状态码,把connection的输入流inputStream、content-length、encoding封装起来返回交给给上一层,这里注意把inputStream抽取出来交给具体去处理非常灵活。

你可能感兴趣的:(Volley学习记录)