Android網路請求 v1.0

keyboard3發表於2017-12-13

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_888;Picasso快取的是全尺寸的;本地快取部分交給了 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)+全尺寸載入
    缺點:沒有重試機制,只支援圖片大小裁剪

番外

  • 如何優雅的展示大圖
    二次取樣、畫素質量引數、壓縮、尺寸裁剪

相關文章