美文网首页
Volley学习记录

Volley学习记录

作者: 耳_总 | 来源:发表于2017-08-16 17:33 被阅读11次

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

    性能上的优化
    使用场景:
    用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<String, String> 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学习记录

          本文链接:https://www.haomeiwen.com/subject/pbrlrxtx.html