美文网首页
Android网络请求 v1.1

Android网络请求 v1.1

作者: keyboard3 | 来源:发表于2017-09-27 23:42 被阅读41次

    Http协议库

    • HttpUrlConnetion
      同步处理网络请求
      底层支持Http1.0,Http1.1。
      缺点:Android2.2之前InputStream调用close(),连接池失效。
      优点:体积小,压缩和缓存机制,api简单,可扩展性大。
    • Apache HttpClient
      同步处理网络请求
      底层支持Http1.0,Http1.1。
      缺点:Android6.0SDK删除了该库,无人维护。
      优点:关注发送请求和接受响应,支持cookie和session,不会缓存响应,HttpUrlConnetion的进化版。
    • OkHttp
      支持异步和同步请求
      1.通过request生成Call
      2.call.enqueue(callback)异步执行网络请求(无主线程通信)
      2.1 异步enquque()内部调用client的dispatcher线程池执行AsyncCall.execute()。
      2.2 AsyncCall.execute调用getResponseWithInterceptorChain()方法,通过拦截链处理request获取网络响应结果,最后将结果回调给callback
      3 同步execute()加入runningSyncCalls。调用getResponseWithInterceptorChain()阻塞获取响应结果。
      底层支持 Http2.0,SPDY支持,连接池,磁盘缓存,透明压缩,NIO
      优点:性能高,且配合Squre全家桶使用无敌

    网络封装库

    • Async-HttpClinet
      原理:
      1.AsyncHttpClient初始化时对http相关参数以及线程池进行配置
      2.通过sendRequest()发送请求监听AsyncHttpResponseHandler回调。
      2.1 线程池执行AsyncHttpRequest异步任务
      2.2 异步任务内通过makeRequestWithRetries()。内部AbstractHttpClient执行execute请求失败重试,成功则responseHandler.sendResponseMessage(result)
      2.3 sendResponseMessage()则将结果通过handler发送给在主线程中的handleMessage调用responseHandler.success()处理结果
      描述:
      基于HttpClient封装的异步网络库,已经放弃维护

    • volley
      原理:
      1.一个页面创建一个RequestQueue(队列请求处理器),内部根据sdk版本创建不同的HurlStack,>=9用HttpUrlConnection,<9用HttpClient。
      2.构造具有回调函数的request。RequestQueue.add()方法中,调用shouldCache如果需要,则mCacheQueue.add().否则就mNetworkQueue.add()
      3.start()启动CacheDispatcher和NetworkDispatcher线程运行,不断尝试获取任务处理。
      4.mCacheDispatcher(单线程)处理该请求,尝试根据request的CacheKey从DiskBasedCache中内存和File中获取,成功就ResponseDelivery处理结果,失败就将请求加入到NetworkQueue中
      5.多个NetworkDispatcher(单线程)根据前面确定的HttpStack处理网络请求,响应结果交给ResponseDelivery处理并判断是否需要缓存。
      6.ExecutorDelivery是ResponseDelivery的实现类,封装了handler。让Handler在主线程中处理request中包含的回调函数
      描述:
      轻量级异步请求库,扩展性强可以支持HttpClient,HttpUrlConnection,Okhttp
      不支持大文件上传

    • retrofit-default
      原理:
      1.通过动态代理生成请求接口实现类。
      2.调用请求时根据retrofit的配置信息converter和callAdapter以及解析请求接口注解生成ServiceMethod
      3.根据ServiceMethod生成OkHttpCall(内部调用对okHttp3.call的调用)
      4.通过CallAdapter将OkHttpCall进行代理适配。默认Android平台是ExcutorCallbackCall
      5.通过基类Call调用enqueue(Callback)进行异步网络请求。okhttp线程池执行网络进行之后回调,callbackExcutor将runable内调用callback.onResponse(result)处理postHandler到主线程。

    • retrofit-rxJava2

    • 项目中的网络封装库
      在Async-HttpClient+网关请求加密签名+sessionKey过期超时重试


    restful
    使用标准的Http方法操作资源的接口规范

    图片请求库

    • volley-NetworkImageView
      原理:
      1.NetworkImageView内通过imageLoader加载url和imageView的大小规格并设置imageListener监听响应结果bitmap设置到自己上。
      2.在imageLoader的get()方法中生成ImageContainer包含存储响应结果的bitmap和imageListner,并将url和imageView的规格生成imageRequest。加入mRequestQueue,线程池执行请求
      3.执行完毕完回调imageRequest的Listener,将保存结果到imageContainer.bitmap上并调用imageContainer.mListener的任务放在handler主线程上执行。
      4.imageListener中获取imageContainer.bitmap设置到ImageView上
    • Universal ImageLoader
      ImageLoader收到加载并显示的任务交给ImageLoaderEngine,ImageLoaderEngine将任务分发给具体的线程池处理,通过cache及ImageDownload去获取图片,中间可能经过ImageDecode和ProcessImage处理,最终交给BitmapDisplay在ImageAware中处理。
    • picasso [squre]
      1.picasso.load()创建RequestCreator,然后链式方法进行相关配置,into创建各种需要加载成功后的处理参数交给Action
      2.Action交给Dispatcher处理,Dispatcher分发到HandlerThread的handler处理
      3.通过forRequest()创建出RequestHandler,并再次将Action等包装成BitmapHunter(缓存读取,bitmap变换)交给ExecutorService处理
      4.通过MemeryCache及requestHandler.load网络获取图片,在主线程将图片经过picassoDrawable显示到target上,然后调用callback.
      Picasso默认的ARGB_8888;Picasso内存的键值是url+imageView的属性;本地缓存部分交给了 okhttp。
      <9 HttpUrlConnection >=9 okhttp
      应用场景:Square全家桶,体积小。webp
    • glide [google推荐图片加载库]
      glide收到加载及显示任务,创建request交给RequestManger,启动Engine去数据源获取图片,获取后通过Transformation处理后交给target.
      模仿了Picasso的API,而且在他的基础上加了很多的扩展(比如gif等支持)
      Glide默认的Bitmap格式是RGB_565 ,而Glide缓存的是跟ImageView尺寸规格的,并支持trimMemory。默认 UrlConnection。gif,web,缩略图
      应用场景:大型的图片流,比如gif、Video,如果你们是做美拍、爱拍这种视频类应用
    • 项目中的图片请求库
      收到加载及显示任务,创建request交给ExcutorService处理,通过memory,disk及网络加载图片并缓存,通过handler处理显示任务
      三级缓存(LruCache+DiskLruCache)+网络性能(HttpClient)+异步任务(ExcutorService)+全尺寸加载
      缺点:没有重试机制,只支持图片大小裁剪

    番外

    • 如何优雅的展示大图
      二次采样、像素质量参数、压缩、尺寸裁剪

    相关文章

      网友评论

          本文标题:Android网络请求 v1.1

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