Android網(wǎng)絡(luò)請(qǐng)求 v1.1

Http協(xié)議庫(kù)

  • HttpUrlConnetion
    同步處理網(wǎng)絡(luò)請(qǐng)求
    底層支持Http1.0,Http1.1。
    缺點(diǎn):Android2.2之前InputStream調(diào)用close(),連接池失效。
    優(yōu)點(diǎn):體積小,壓縮和緩存機(jī)制,api簡(jiǎn)單,可擴(kuò)展性大。
  • Apache HttpClient
    同步處理網(wǎng)絡(luò)請(qǐng)求
    底層支持Http1.0,Http1.1。
    缺點(diǎn):Android6.0SDK刪除了該庫(kù),無(wú)人維護(hù)。
    優(yōu)點(diǎn):關(guān)注發(fā)送請(qǐng)求和接受響應(yīng),支持cookie和session,不會(huì)緩存響應(yīng),HttpUrlConnetion的進(jìn)化版。
  • OkHttp
    支持異步和同步請(qǐng)求
    1.通過(guò)request生成Call
    2.call.enqueue(callback)異步執(zhí)行網(wǎng)絡(luò)請(qǐng)求(無(wú)主線(xiàn)程通信)
    2.1 異步enquque()內(nèi)部調(diào)用client的dispatcher線(xiàn)程池執(zhí)行AsyncCall.execute()。
    2.2 AsyncCall.execute調(diào)用getResponseWithInterceptorChain()方法,通過(guò)攔截鏈處理request獲取網(wǎng)絡(luò)響應(yīng)結(jié)果,最后將結(jié)果回調(diào)給callback
    3 同步execute()加入runningSyncCalls。調(diào)用getResponseWithInterceptorChain()阻塞獲取響應(yīng)結(jié)果。
    底層支持 Http2.0,SPDY支持,連接池,磁盤(pán)緩存,透明壓縮,NIO
    優(yōu)點(diǎn):性能高,且配合Squre全家桶使用無(wú)敵

網(wǎng)絡(luò)封裝庫(kù)

  • Async-HttpClinet
    原理:
    1.AsyncHttpClient初始化時(shí)對(duì)http相關(guān)參數(shù)以及線(xiàn)程池進(jìn)行配置
    2.通過(guò)sendRequest()發(fā)送請(qǐng)求監(jiān)聽(tīng)AsyncHttpResponseHandler回調(diào)。
    2.1 線(xiàn)程池執(zhí)行AsyncHttpRequest異步任務(wù)
    2.2 異步任務(wù)內(nèi)通過(guò)makeRequestWithRetries()。內(nèi)部AbstractHttpClient執(zhí)行execute請(qǐng)求失敗重試,成功則responseHandler.sendResponseMessage(result)
    2.3 sendResponseMessage()則將結(jié)果通過(guò)handler發(fā)送給在主線(xiàn)程中的handleMessage調(diào)用responseHandler.success()處理結(jié)果
    描述:
    基于HttpClient封裝的異步網(wǎng)絡(luò)庫(kù),已經(jīng)放棄維護(hù)

  • volley
    原理:
    1.一個(gè)頁(yè)面創(chuàng)建一個(gè)RequestQueue(隊(duì)列請(qǐng)求處理器),內(nèi)部根據(jù)sdk版本創(chuàng)建不同的HurlStack,>=9用HttpUrlConnection,<9用HttpClient。
    2.構(gòu)造具有回調(diào)函數(shù)的request。RequestQueue.add()方法中,調(diào)用shouldCache如果需要,則mCacheQueue.add().否則就mNetworkQueue.add()
    3.start()啟動(dòng)CacheDispatcher和NetworkDispatcher線(xiàn)程運(yùn)行,不斷嘗試獲取任務(wù)處理。
    4.mCacheDispatcher(單線(xiàn)程)處理該請(qǐng)求,嘗試根據(jù)request的CacheKey從DiskBasedCache中內(nèi)存和File中獲取,成功就ResponseDelivery處理結(jié)果,失敗就將請(qǐng)求加入到NetworkQueue中
    5.多個(gè)NetworkDispatcher(單線(xiàn)程)根據(jù)前面確定的HttpStack處理網(wǎng)絡(luò)請(qǐng)求,響應(yīng)結(jié)果交給ResponseDelivery處理并判斷是否需要緩存。
    6.ExecutorDelivery是ResponseDelivery的實(shí)現(xiàn)類(lèi),封裝了handler。讓Handler在主線(xiàn)程中處理request中包含的回調(diào)函數(shù)
    描述:
    輕量級(jí)異步請(qǐng)求庫(kù),擴(kuò)展性強(qiáng)可以支持HttpClient,HttpUrlConnection,Okhttp
    不支持大文件上傳

  • retrofit-default
    原理:
    1.通過(guò)動(dòng)態(tài)代理生成請(qǐng)求接口實(shí)現(xiàn)類(lèi)。
    2.調(diào)用請(qǐng)求時(shí)根據(jù)retrofit的配置信息converter和callAdapter以及解析請(qǐng)求接口注解生成ServiceMethod
    3.根據(jù)ServiceMethod生成OkHttpCall(內(nèi)部調(diào)用對(duì)okHttp3.call的調(diào)用)
    4.通過(guò)CallAdapter將OkHttpCall進(jìn)行代理適配。默認(rèn)Android平臺(tái)是ExcutorCallbackCall
    5.通過(guò)基類(lèi)Call調(diào)用enqueue(Callback)進(jìn)行異步網(wǎng)絡(luò)請(qǐng)求。okhttp線(xiàn)程池執(zhí)行網(wǎng)絡(luò)進(jìn)行之后回調(diào),callbackExcutor將runable內(nèi)調(diào)用callback.onResponse(result)處理postHandler到主線(xiàn)程。

  • retrofit-rxJava2

  • 項(xiàng)目中的網(wǎng)絡(luò)封裝庫(kù)
    在Async-HttpClient+網(wǎng)關(guān)請(qǐng)求加密簽名+sessionKey過(guò)期超時(shí)重試


restful
使用標(biāo)準(zhǔn)的Http方法操作資源的接口規(guī)范

圖片請(qǐng)求庫(kù)

  • volley-NetworkImageView
    原理:
    1.NetworkImageView內(nèi)通過(guò)imageLoader加載url和imageView的大小規(guī)格并設(shè)置imageListener監(jiān)聽(tīng)響應(yīng)結(jié)果bitmap設(shè)置到自己上。
    2.在imageLoader的get()方法中生成ImageContainer包含存儲(chǔ)響應(yīng)結(jié)果的bitmap和imageListner,并將url和imageView的規(guī)格生成imageRequest。加入mRequestQueue,線(xiàn)程池執(zhí)行請(qǐng)求
    3.執(zhí)行完畢完回調(diào)imageRequest的Listener,將保存結(jié)果到imageContainer.bitmap上并調(diào)用imageContainer.mListener的任務(wù)放在handler主線(xiàn)程上執(zhí)行。
    4.imageListener中獲取imageContainer.bitmap設(shè)置到ImageView上
  • Universal ImageLoader
    ImageLoader收到加載并顯示的任務(wù)交給ImageLoaderEngine,ImageLoaderEngine將任務(wù)分發(fā)給具體的線(xiàn)程池處理,通過(guò)cache及ImageDownload去獲取圖片,中間可能經(jīng)過(guò)ImageDecode和ProcessImage處理,最終交給BitmapDisplay在ImageAware中處理。
  • picasso [squre]
    1.picasso.load()創(chuàng)建RequestCreator,然后鏈?zhǔn)椒椒ㄟM(jìn)行相關(guān)配置,into創(chuàng)建各種需要加載成功后的處理參數(shù)交給Action
    2.Action交給Dispatcher處理,Dispatcher分發(fā)到HandlerThread的handler處理
    3.通過(guò)forRequest()創(chuàng)建出RequestHandler,并再次將Action等包裝成BitmapHunter(緩存讀取,bitmap變換)交給ExecutorService處理
    4.通過(guò)MemeryCache及requestHandler.load網(wǎng)絡(luò)獲取圖片,在主線(xiàn)程將圖片經(jīng)過(guò)picassoDrawable顯示到target上,然后調(diào)用callback.
    Picasso默認(rèn)的ARGB_8888;Picasso內(nèi)存的鍵值是url+imageView的屬性;本地緩存部分交給了 okhttp。
    <9 HttpUrlConnection >=9 okhttp
    應(yīng)用場(chǎng)景:Square全家桶,體積小。webp
  • glide [google推薦圖片加載庫(kù)]
    glide收到加載及顯示任務(wù),創(chuàng)建request交給RequestManger,啟動(dòng)Engine去數(shù)據(jù)源獲取圖片,獲取后通過(guò)Transformation處理后交給target.
    模仿了Picasso的API,而且在他的基礎(chǔ)上加了很多的擴(kuò)展(比如gif等支持)
    Glide默認(rèn)的Bitmap格式是RGB_565 ,而Glide緩存的是跟ImageView尺寸規(guī)格的,并支持trimMemory。默認(rèn) UrlConnection。gif,web,縮略圖
    應(yīng)用場(chǎng)景:大型的圖片流,比如gif、Video,如果你們是做美拍、愛(ài)拍這種視頻類(lèi)應(yīng)用
  • 項(xiàng)目中的圖片請(qǐng)求庫(kù)
    收到加載及顯示任務(wù),創(chuàng)建request交給ExcutorService處理,通過(guò)memory,disk及網(wǎng)絡(luò)加載圖片并緩存,通過(guò)handler處理顯示任務(wù)
    三級(jí)緩存(LruCache+DiskLruCache)+網(wǎng)絡(luò)性能(HttpClient)+異步任務(wù)(ExcutorService)+全尺寸加載
    缺點(diǎn):沒(méi)有重試機(jī)制,只支持圖片大小裁剪

番外

  • 如何優(yōu)雅的展示大圖
    二次采樣、像素質(zhì)量參數(shù)、壓縮、尺寸裁剪
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,502評(píng)論 19 139
  • 網(wǎng)絡(luò)請(qǐng)求是android客戶(hù)端很重要的部分。下面從入門(mén)級(jí)開(kāi)始介紹下自己Android網(wǎng)絡(luò)請(qǐng)求的實(shí)踐歷程。希望能給剛...
    passiontim閱讀 1,449評(píng)論 0 17
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 178,716評(píng)論 25 709
  • 家是私人的獨(dú)立空間,也是長(zhǎng)期居住的住所。有時(shí)候問(wèn)自己:我們努力奮斗、拼命賺錢(qián),為了什么?——不就是為了讓自...
    冷冷的燕尾蝶閱讀 359評(píng)論 0 0
  • 蘇格拉底成交法招商贏舉例: 親,關(guān)注你好久了,看你朋友圈你是做XX產(chǎn)品的吧? 做了有一段時(shí)間了團(tuán)隊(duì)大概多少人了那?...
    慕容培訓(xùn)教練閱讀 380評(píng)論 0 0

友情鏈接更多精彩內(nèi)容