Android的開發之&論網絡加載框架(Android-async-http,afinal,xUtils,Volley,okhttp,Retrofit)的特色和優缺點

目錄java

        一:HTTP,TCP,UDP,Socketandroid

            一、TCP   HTTP   UDP三者的關係git

              二、TCP簡介和特色程序員

              二、TCP簡介和特色github

              三、UDP簡介和特色web

              四、HTTP簡介和特色ajax

              五、Socket簡介和優缺點算法

        二:HttpURLConnection和httpclientsql

            一、HttpURLConnection簡介數據庫

              二、httpclient簡介

        三:android經常使用網絡框架

            一、Android-async-http 簡介

              二、android-afinal框架簡介和特色

              二、android-afinal框架簡介和特色

              三、android-xutils框架簡介和特色

              四、android-Volley框架簡介和特色

              五、android-OkHttp框架簡介和特色

              六、android-Retrofit框架簡介和特色


一:HTTP,TCP,UDP,Socket簡要介紹

  • TCP簡要介紹

    一、TCP   HTTP   UDP三者的關係:

        (1)TCP/IP是個協議組,可分爲四個層次:網絡接口層、網絡層、傳輸層和應用層。

        (2)在網絡層有:IP協議、ICMP協議、ARP協議、RARP協議和BOOTP協議。

        (3)在傳輸層中有:TCP協議與UDP協議。 

        (4)在應用層有:FTP、HTTP、TELNET、SMTP、DNS等協議。 

        (5)所以,HTTP自己就是一個協議,是從Web服務器傳輸超文本到本地瀏覽器的傳送協議。

    二、TCP簡要介紹:
        TCP是面向鏈接的、傳輸可靠(保證數據正確性且保證數據順序)、用於傳輸大量數據(流模式)、速度慢,創建鏈接須要開銷較多(時間,系統資源)。
    3TCP三次握手:
創建一個TCP鏈接時,須要客戶端和服務器總共發送3個包。
  三次握手的目的是鏈接服務器指定端口,創建TCP鏈接,並同步鏈接雙方的序列號和確認號並交換 TCP 窗口大小信息.在 Socket 編程中,客戶端執行connect()時。將觸發三次握手。
首先了解一下幾個標誌,SYN(synchronous),同步標誌,ACK (Acknowledgement),即確認標誌,seq是Sequence Number(序列號)。
  第一次握手:客戶端發送一個TCP的SYN標誌位置1的包指明客戶打算鏈接的服務器的端口,以及初始序號X,保存在包頭的序列號(Sequence Number)字段裏。
  第二次握手:服務器發回確認包(ACK)應答。即SYN標誌位和ACK標誌位均爲1同時,將確認序號(Acknowledgement Number)設置爲客戶的序列號加1以,即X+1。
  第三次握手:客戶端再次發送確認包(ACK) SYN標誌位爲0,ACK標誌位爲1。而且把服務器發來ACK的序號字段+1,放在肯定字段中發送給對方.而且在數據段放寫序列號的+1。

    4tcp四次揮手
        TCP的鏈接的拆除須要發送四個包,所以稱爲四次揮手(four-way handshake)。

    5爲何鏈接的時候是三次握手,關閉的時候倒是四次揮手?
        由於當Server端收到Client端的SYN鏈接請求報文後,能夠直接發送SYN+ACK報文。其中ACK報文是用來應答的,SYN報文是用來 同步的。可是關閉鏈接時,當Server端收到FIN報文時,極可能並不會當即關閉SOCKET,因此只能先回復一個ACK報文,告訴Client端,」 你發的FIN報文我收到了」。只有等到我Server端全部的報文都發送完了,我才能發送FIN報文,所以不能一塊兒發送。故須要四步握手。

    6TCP的優勢:
        可靠,穩定 TCP的可靠體如今TCP在傳遞數據以前,會有三次握手來創建鏈接,並且在數據傳遞時,有確認、窗口、重傳、擁塞控制機制,在數據傳完後,還會斷開鏈接用來節約系統資源。
   
    7TCP的缺點:
        慢,效率低,佔用系統資源高,易被攻擊 TCP在傳遞數據以前,要先建鏈接,這會消耗時間,並且在數據傳遞時,確認機制、重傳機制、擁塞控制機制等都會消耗大量的時間,並且要在每臺設備上維護全部的傳輸鏈接,事實上,每一個鏈接都會佔用系統的CPU、內存等硬件資源。 並且,由於TCP有確認機制、三次握手機制,這些也致使TCP容易被人利用,實現DOS、DDOS、CC等攻擊。

三、UDP:
面向非鏈接、傳輸不可靠、用於傳輸少許數據(數據包模式)、速度快。
UDP的優勢: 快,比TCP稍安全 UDP沒有TCP的握手、確認、窗口、重傳、擁塞控制等機制,UDP是一個無狀態的傳輸協議,因此它在傳遞數據時很是快。沒有TCP的這些機制,UDP較TCP被攻擊者利用的漏洞就要少一些。但UDP也是沒法避免攻擊的,好比:UDP Flood攻擊…… UDP的
UDP缺點:不可靠,不穩定,由於UDP沒有TCP那些可靠的機制,在數據傳遞時,若是網絡質量很差,就會很容易丟包。

四、 http
HTTP協議即超文本傳送協議(HypertextTransfer Protocol ),是Web聯網的基礎,也是手機聯網經常使用的協議之一,HTTP協議是創建在TCP協議之上的一種應用。
特色
  HTTP鏈接最顯著的特色是客戶端發送的每次請求都須要服務器回送響應,在請求結束後,會主動釋放鏈接,從創建鏈接到關閉鏈接的過程稱爲「一次鏈接」,所以HTTP鏈接是一種「短鏈接」
  1)在HTTP 1.0中,客戶端的每次請求都要求創建一次單獨的鏈接,在處理完本次請求後,就自動釋放鏈接。
  2)在HTTP 1.1中則能夠在一次鏈接中處理多個請求,而且多個請求能夠重疊進行,不須要等待一個請求結束後再發送下一個請求。
  
HTTP是基於客戶端/服務端(C/S)的架構模型
  客戶端發送一個HTTP請求到服務器的請求消息包括如下格式:請求行(request line)、請求頭部(header)、空行和請求數據四個部分組成,
HTTP響應也由四個部分組成,分別是:狀態行、消息報頭、空行和響應正文。

HTTP優勢:
(1)基於應用級的接口使用方便
(2)程序員開發水平要求不高,容錯性強
HTTP缺點:
(1)傳輸速度慢,數據包大(Http協議中包含輔助應用信息)
(2)如實時交互,服務器性能壓力大。
(3)數據傳輸安全性差

五、Socket
網絡上的兩個程序經過一個雙向的通訊鏈接實現數據的交換,這個鏈接的一端稱爲一個socket。
創建網絡通訊鏈接至少要一對端口號(socket)。socket本質是編程接口(API),對TCP/IP的封裝,TCP/IP也要提供可供程序員作網絡開發所用的接口,這就是Socket編程接口;HTTP是轎車,提供了封裝或者顯示數據的具體形式;Socket是發動機,提供了網絡通訊的能力。

Socket 優勢:
 (1)  傳輸數據爲字節級,傳輸數據可自定義,數據量小(對於手機應用講:費用低)
 (2)傳輸數據時間短,性能高
 (3)適合於客戶端和服務器端之間信息實時交互
 (4)能夠加密,數據安全性強
Socket缺點:
(1)需對傳輸的數據進行解析,轉化成應用級的數據
(2)對開發人員的開發水平要求高
(3)相對於Http協議傳輸,增長了開發量

二:HttpURLConnection和httpclient

在Android開發中網絡請求是最經常使用的操做之一, Android SDK中對HTTP(超文本傳輸協議)也提供了很好的支持,這裏包括兩種接口: 
一、標準Java接口(java.NET) —-HttpURLConnection,能夠實現簡單的基於URL請求、響應功能; 
二、Apache接口(org.appache.http)—-HttpClient,使用起來更方面更強大。
但在android API23的SDK中Google將HttpClient移除了。Google建議使用httpURLconnection進行網絡訪問操做。
HttpURLconnection是基於http協議的,支持get,post,put,delete等各類請求方式,最經常使用的就是get和post,下面針對這兩種請求方式進行講解。

一、HttpURLConnection
在JDK的java.net包中已經提供了訪問HTTP協議的基本功能的類:HttpURLConnection。
HttpURLConnection是Java的標準類,它繼承自URLConnection,可用於向指定網站發送GET請求、POST請求。

二、httpclient
HttpClient 是Apache Jakarta Common 下的子項目,能夠用來提供高效的、最新的、功能豐富的支持 HTTP 協議的客戶端編程工具包,而且它支持 HTTP 協議最新的版本和建議。
功能介紹

三:android經常使用網絡框架

一、Android-async-http 
Android-async-http 是一個強大的網絡請求庫,這個網絡請求庫是基於 Apache HttpClient 庫之上的一個異步網絡請求處理庫,網絡處理均基於 Android 的非 UI 線程,經過回調方法處理請求結果。 
android-async-http 是一個強大的第三方開源網絡請求庫。惋惜的是 Android 6.0 (api 23) SDK,再也不提供 org.apache.http.* (只保留幾個類)。
優勢: 
(1) 在匿名回調中處理請求結果 
(2) 在 UI 線程外進行 http 請求 
(3) 文件斷點上傳 
(4) 智能重試 
(5) 默認 gzip 壓縮 
(6) 支持解析成 Json 格式 
(7) 可將 Cookies 持久化到 SharedPreference


二、afinal
afinal是一個開源的android的orm和ioc應用開發框架,其特色是小巧靈活,代碼入侵量少。
簡介
在android應用開發中,經過afinal的ioc框架,諸如ui綁定,事件綁定,經過註解能夠自動綁定。經過afinal的orm框架,無需任何配置信息,一行代碼就能夠對android的sqlite數據庫進行增刪改查操做。同時,afinal內嵌了finalHttp等簡單易用的工具,能夠輕鬆的對http請求進行操做。
主要組件
     FinalHttp:用於請求http數據,直接ajax方式請求,文件上傳, 斷點續傳下載文件等
  FinalBitmap:用於顯示bitmap圖片,而無需考慮線程併發和oom等問題。
  FinalActivity:徹底能夠經過註解方式綁定控件和事件,無需編寫代碼。
  FinalDb:android中sqlite的orm框架,一行代碼搞定增刪改查。
特色
     設計簡單小巧靈活
      orm零配置,但能夠配置,能夠經過靈活的註解配置達到更增強大的功能
     數據庫查詢支持DbModel,能夠輕鬆的進行各類複雜的查詢
     android的ui和事件綁定徹底經過註解的方式,無需編寫一行代碼
     http請求支持ajax方式請求
     體積小(不到100KB),不依賴第三方jar包

FinalDB優勢
     android中的orm框架,一行代碼就能夠進行增刪改查。支持一對多,多對一等查詢。

FinalDb的缺點
     目前暫時不支持複合主鍵,而且對SQL語句的支持也很是有限,一些比較複雜的業務邏輯實現很是麻煩!


三、xUtils簡介
xUtils是基於Afinal開發的目前功能比較完善的一個Android開源框架,最近又發佈了xUtil3.0,在增長新功能的同時又提升了框架的性能,下面來看看官方(https://github.com/wyouflf/xUtils3)對xUtils3的介紹:
  • xUtils包含了不少實用的android工具;
  • xUtils支持超大文件(超過2G)上傳,更全面的http請求協議支持(11種謂詞),擁有更加靈活的ORM,更多的事件註解支持且不受混淆影響;
  • xUitls最低兼容android 2.2 (api level 8)!
  • xUtils3變化較多因此創建了新的項目不在舊版(github.com/wyouflf/xUtils)上繼續維護, 相對於舊版本: 
  • HTTP實現替換HttpClient爲UrlConnection, 自動解析回調泛型, 更安全的斷點續傳策略;
  • 支持標準的Cookie策略, 區分domain, path;
  • 事件註解去除不經常使用的功能, 提升性能;
  • 數據庫api簡化提升性能, 達到和greenDao一致的性能;
  • 圖片綁定支持gif(受系統兼容性影響, 部分gif文件只能靜態顯示), webp; 支持圓角, 圓形, 方形等裁剪, 支持自動旋轉。
目前xUtils主要有四大模塊:
ViewUtils模塊:
  • android中的ioc(控制倒轉)框架,徹底註解方式就能夠進行UI,資源和事件綁定;
  • 新的事件綁定方式,使用混淆工具混淆後仍可正常工做;
  • 目前支持經常使用的20種事件綁定,參見ViewCommonEventListener類和包com.lidroid.xutils.view.annotation.event。
HttpUtils模塊:
  • 支持同步,異步方式的請求;
  • 支持大文件上傳,上傳大文件不會oom;
  • 支持GET,POST,PUT,MOVE,COPY,DELETE,HEAD,OPTIONS,TRACE,CONNECT請求;
  • 下載支持301/302重定向,支持設置是否根據Content-Disposition重命名下載的文件;
  • 返回文本內容的請求(默認只啓用了GET請求)支持緩存,可設置默認過時時間和針對當前請求的過時時間。
BitmapUtils模塊:
  • 加載bitmap的時候無需考慮bitmap加載過程當中出現的oom和android容器快速滑動時候出現的圖片錯位等現象;
  • 支持加載網絡圖片和本地圖片;
  • 內存管理使用lru算法,更好的管理bitmap內存;
  • 可配置線程加載線程數量,緩存大小,緩存路徑,加載顯示動畫等…
DbUtils模塊:
  • android中的orm(對象關係映射)框架,一行代碼就能夠進行增刪改查;
  • 支持事務,默認關閉;
  • 可經過註解自定義表名,列名,外鍵,惟一性約束,NOT NULL約束,CHECK約束等(須要混淆的時候請註解表名和列名);
  • 支持綁定外鍵,保存實體時外鍵關聯實體自動保存或更新;
  • 自動加載外鍵關聯實體,支持延時加載;
  • 支持鏈式表達查詢,更直觀的查詢語義,參考下面的介紹或sample中的例子。

四、Volley框架
在2013年Google I/O大會上推出了一個新的網絡通訊框架Volley。Volley既能夠訪問網絡取得數據,也能夠加載圖片,而且在性能方面也進行了大幅度的調整,它的設計目標就是很是適合去進行數據量不大,但通訊頻繁的網絡操做,而對於大數據量的網絡操做,好比說下載文件等,Volley的表現就會很是糟糕。在使用Volley前請下載Volley庫並放在libs目錄下並add到工程中。
Volley的主要特性
(1). 擴展性強。Volley 中大可能是基於接口的設計,可配置性強。
(2). 必定程度符合 Http 規範,包括返回 ResponseCode(2xx、3xx、4xx、5xx)的處理,請求頭的處理,緩存機制的支持等。並支持重試及優先級定義。
(3). 默認 Android2.3 及以上基於 HttpURLConnection,2.3 如下基於 HttpClient 實現,這二者的區別及優劣在4.2.1 Volley中具體介紹。
(4). 提供簡便的圖片加載工具。
1.2. Volley提供的功能
簡單來講,它提供了以下的便利功能:
  • JSON,圖像等的異步下載;
  • 網絡請求的排序(scheduling)
  • 網絡請求的優先級處理
  • 緩存
  • 多級別取消請求
  • 和Activity和生命週期的聯動(Activity結束時同時取消全部網絡請求)
Volley的優勢
  • 很是適合進行數據量不大,但通訊頻繁的網絡操做
  • 可直接在主線程調用服務端並處理返回結果
  • 能夠取消請求,容易擴展,面向接口編程
  • 網絡請求線程NetworkDispatcher默認開啓了4個,能夠優化,經過手機CPU數量
  • 經過使用標準的HTTP緩存機制保持磁盤和內存響應的一致
  •  通訊更快、更穩定、更簡單
Volley的缺點
  • 使用的是HttpClient的,HttpURLConnection類
  • 6.0不支持的HttpClient了,若是想支持得添加org.apache.http.legacy.jar
  • 對大文件下載Volley的表現很是糟糕
  • 只支持HTTP請求
  • 圖片加載性能通常
  • 不適合進行大數據的上傳和下載
  • 不能下載文件:這也是它最致命的地方
爲何使用Volley:
Ø  高效的的Get/Post方式的數據請求交互
Ø  網絡圖片的加載和緩存
Ø  谷歌官方推出
Ø  性能穩定和強勁

五、okhttp
android網絡框架之OKhttp 
一個處理網絡請求的開源項目,是安卓端最火熱的輕量級框架,由移動支付Square公司貢獻(該公司還貢獻了Picasso) 
用於替代HttpUrlConnection和Apache HttpClient(android API23 6.0裏已移除HttpClient,如今已經打不出來)
優點
1.支持HTTP2/SPDY(SPDY是Google開發的基於TCP的傳輸層協議,用以最小化網絡延遲,提高網絡速度,優化用戶的網絡使用體驗。)
2.容許鏈接到同一個主機地址的全部請求,提升請求效率 
3.socket自動選擇最好路線,並支持自動重連,擁有自動維護的socket鏈接池,減小握手次數,減小了請求延遲,共享Socket,減小對服務器的請求次數 
4. 基於Headers的緩存策略減小重複的網絡請求。
5.緩存響應數據來減小重複的網絡請求 
6.減小了對數據流量的消耗 
7.自動處理GZip壓縮 

OKHttp是Android版Http客戶端。很是高效,支持SPDY、鏈接池、GZIP和HTTP緩存。
支持SPDY,能夠合併多個到同一個主機的請求
OkHttp實現的諸多技術如:鏈接池,gziping,緩存等就知道網絡相關的操做是多麼複雜了。
OkHttp扮演着傳輸層的角色。
OkHttp使用Okio來大大簡化數據的訪問與存儲,Okio是一個加強 java.io 和 java.nio的庫。
OkHttp 處理了不少網絡疑難雜症:會從不少經常使用的鏈接問題中自動恢復。若是您的服務器配置了多個IP地址,當第一個IP鏈接失敗的時候,OkHttp會自動嘗試下一個IP。
OkHttp還處理了代理服務器問題和SSL握手失敗問題。
OkHttp是一個Java的HTTP+SPDY客戶端開發包,同時也支持Android。須要Android 2.3以上
OKHttp是Android版Http客戶端。很是高效,支持SPDY、鏈接池、GZIP和 HTTP 緩存。
默認狀況下,OKHttp會自動處理常見的網絡問題,像二次鏈接、SSL的握手問題。
若是你的應用程序中集成了OKHttp,Retrofit默認會使用OKHttp處理其餘網絡層請求。
從Android4.4開始HttpURLConnection的底層實現採用的是okHttp 
    緩存響應避免重複的網絡請求

  1. PUT,DELETE,POST,GET等請求
  2. 文件的上傳下載 
  3. 加載圖片(內部會圖片大小自動壓縮) 
  4. 支持請求回調,直接返回對象、對象集合 
  5. 支持session的保持 

流程圖

功能
•     通常的get請求
•     通常的post請求
•     基於Http的文件上傳
•     文件下載
•     上傳下載的進度回調
•     加載圖片
•     支持請求回調,直接返回對象、對象集合
•     支持session的保持
•     支持自簽名網站https的訪問,提供方法設置下證書就行
•     支持取消某個請求

六、Retrofit
Retrofit與okhttp共同出自於Square公司,retrofit就是對okhttp作了一層封裝。把網絡請求都交給給了Okhttp,咱們只須要經過簡單的配置就能使用retrofit來進行網絡請求了,其主要做者是Android大神JakeWharton
Retrofit特性
  1. 將rest API封裝爲java接口,咱們根據業務需求來進行接口的封裝,實際開發可能會封裝多個不一樣的java接口以知足業務需求。(注意:這裏會用到Retrofit的註解:好比get,post)
  2. 使用Retrofit提供的封裝方法將咱們的生成咱們接口的實現類,這個真的很贊,不用咱們本身實現,經過註解Retrofit所有幫咱們自動生成好了。
  3. 調用咱們實現類對象的接口方法。
這樣寫都太抽象了,看一段代碼:
4、爲何要用Retrofit
一、我們一塊兒來看下Retrofit的優勢:
  • 請求的方法參數註解能夠定製
  • 支持同步、異步和RxJava
  • 超級解耦(我最愛)
  • 能夠配置不一樣的反序列化工具來解析數據,如json、xml等
二、爲何使用Retrofit?
在處理HTTP請求的時候,由於不一樣場景或者邊界狀況等比較難處理。你須要考慮網絡狀態,須要在請求失敗後重試,須要處理HTTPS等問題,二這些事情讓你很苦惱,而Retrofit能夠將你從這些頭疼的事情中解放出來。
固然你也能夠選擇android-async-http和Volley,但爲何選擇Retrofit?首先效率高,其次Retrofit強大且配置靈活,第三和OkHttp無縫銜接,第四Jack Wharton主導的(你懂的)。
在Retrofit2以前,OkHttp是一個可選的客戶端。二Retrofit2中,Retrofit與OkHttp強耦合,使得更好地利用OkHttp,包括使用OkHttp解決一些棘手的問題。
流程圖

優勢: 
能夠配置不一樣HTTP client來實現網絡請求,如okhttp、httpclient等 
請求的方法參數註解均可以定製 
支持同步、異步和RxJava 
超級解耦 
能夠配置不一樣的反序列化工具來解析數據,如json、xml等 
使用很是方便靈活 
框架使用了不少設計模式(感興趣的能夠看看源碼學習學習) 
缺點: 
不能接觸序列化實體和響應數據 
執行的機制太嚴格 
使用轉換器比較低效 
只能支持簡單自定義參數類型