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

目錄

        一:HTTP,TCP,UDP,Socket

            1、TCP   HTTP   UDP三者的關係

              2、TCP簡介和特點

              2、TCP簡介和特點

              3、UDP簡介和特點

              4、HTTP簡介和特點

              5、Socket簡介和優缺點

        二:HttpURLConnection和httpclient

            1、HttpURLConnection簡介

              2、httpclient簡介

        三:android常用網絡框架

            1、Android-async-http 簡介

              2、android-afinal框架簡介和特點

              2、android-afinal框架簡介和特點

              3、android-xutils框架簡介和特點

              4、android-Volley框架簡介和特點

              5、android-OkHttp框架簡介和特點

              6、android-Retrofit框架簡介和特點


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

  • TCP簡要介紹

    1、TCP   HTTP   UDP三者的關係:

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

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

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

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

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

    2、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等攻擊。

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

4、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)數據傳輸安全性差

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

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

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

三:android常用網絡框架

1、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


2、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語句的支持也非常有限,一些比較複雜的業務邏輯實現非常麻煩!


3、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中的例子。

4、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方式的數據請求交互
Ø  網絡圖片的加載和緩存
Ø  谷歌官方推出
Ø  性能穩定和強勁

5、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的訪問,提供方法設置下證書就行
•     支持取消某個請求

6、Retrofit
Retrofit與okhttp共同出自於Square公司,retrofit就是對okhttp做了一層封裝。把網絡請求都交給給了Okhttp,我們只需要通過簡單的配置就能使用retrofit來進行網絡請求了,其主要作者是Android大神JakeWharton
Retrofit特性
  1. 將rest API封裝爲java接口,我們根據業務需求來進行接口的封裝,實際開發可能會封裝多個不同的java接口以滿足業務需求。(注意:這裏會用到Retrofit的註解:比如get,post)
  2. 使用Retrofit提供的封裝方法將我們的生成我們接口的實現類,這個真的很贊,不用我們自己實現,通過註解Retrofit全部幫我們自動生成好了。
  3. 調用我們實現類對象的接口方法。
這樣寫都太抽象了,看一段代碼:
四、爲什麼要用Retrofit
1、咱們一起來看下Retrofit的優點:
  • 請求的方法參數註解可以定製
  • 支持同步、異步和RxJava
  • 超級解耦(我最愛)
  • 可以配置不同的反序列化工具來解析數據,如json、xml等
2、爲什麼使用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等 
使用非常方便靈活 
框架使用了很多設計模式(感興趣的可以看看源碼學習學習) 
缺點: 
不能接觸序列化實體和響應數據 
執行的機制太嚴格 
使用轉換器比較低效 
只能支持簡單自定義參數類型 

    
發佈了68 篇原創文章 · 獲贊 17 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章