Android网络请求 v1.1

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)+全尺寸加载
    缺点:没有重试机制,只支持图片大小裁剪

番外

  • 如何优雅的展示大图
    二次采样、像素质量参数、压缩、尺寸裁剪
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,547评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,399评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,428评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,599评论 1 274
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,612评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,577评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,941评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,603评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,852评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,605评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,693评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,375评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,955评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,936评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,172评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,970评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,414评论 2 342

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,585评论 18 139
  • 网络请求是android客户端很重要的部分。下面从入门级开始介绍下自己Android网络请求的实践历程。希望能给刚...
    passiontim阅读 1,374评论 0 17
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,400评论 25 707
  • 家是私人的独立空间,也是长期居住的住所。有时候问自己:我们努力奋斗、拼命赚钱,为了什么?——不就是为了让自...
    冷冷的燕尾蝶阅读 329评论 0 0
  • 苏格拉底成交法招商赢举例: 亲,关注你好久了,看你朋友圈你是做XX产品的吧? 做了有一段时间了团队大概多少人了那?...
    慕容培训教练阅读 339评论 0 0