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ù)、壓縮、尺寸裁剪