HTTP 是應用層協議,TCP 是傳輸層協議(位於應用層之下)。
一般來說,移動應用推薦使用 HTTP 協議,有很多優點:
1. HTTP 發展成熟
HTTP 幾乎已經快成爲一種通用的 Web 標準,Web Services、Open API 等等都是基於 HTTP 協議的。幾乎所有數據的傳輸(多媒體、XML、JSON)都可以採用 HTTP。
2. 後臺複用
因爲很多應用,除了有移動端,還有Web端,甚至桌面端。Web 版中前後臺交互,無論是頁面請求還是AJAX 請求,都是採用標準 HTTP 協議。那麼其他的客戶端沒有理由重新設計一套協議。
3. HTML 5 應用
現在不少移動產品都採用或者半採用 HTML 5 技術,那麼和服務器的交互又迴歸到 AJAX 上。不用說,還是離不開 HTTP。
對於TCP傳輸層協議使用——實時推送 socket長連接
個人理解,移動端http通信經歷了三代,原生SDK,封裝框架,整合資源。
一、框架背景
第一章 我們從第一代的原生態http通信——第二代的封裝類庫——第三代的資源整合。通過比較不同通信方式的優缺點,瞭解什麼是volley,爲什麼用volley,一層層揭開他的神祕之紗。
1.原生SDK——HttpURLConnection
HttpURLConnection是java的標準類,是一種多用途、輕量極的HTTP客戶端,使用它來進行HTTP操作可以適用於大多數的應用程序。
public String userLogin(String username,String userpwd){
String urlPost = "http://xxx.com?username=" + username + "&userpwd = " + userpwd;
URL url = new URL(urlPost );
HttpURLConnection conn = (HttpURLConnection)url.openConnection();
conn.setRequestMethod("POST");
conn.connect();
InputStream is = conn.getInputStream();
String s = StreamTools.readInputStream(is);
return s;
}
優點:
(1).API簡單,容易使用和擴展;
(2).壓縮,體積小減少網絡訪問的流量;
(3).速度快,較省電。
缺點:
(1).原始,封裝性差;
(2).重訪問自定義不方便。
(3).android2.2 前bug多 (一個可讀的InputStream調用close()方法時,就有可能會導致連接池失效了)
2.原生SDK——HttpClient
HttpClient是Apache開源子項目,用來提供高效的、最新的、功能豐富的支持HTTP協議的客戶端編程工具包,封裝了訪問http的請求頭,參數,內容體,響應等等。
public String userLogin(String username,String userpwd){
HttpClient client = new DefaultHttpClient();
String urlPost = "http://xxx.com";
HttpPost httpPost = new HttPost(urlPost);
List<NameValuePair> params = new ArrayList<NameValuePair>();
params.add(new BasicNameValuePair("username", username));
params.add(new BasicNameValuePair("userpwd", userpwd));
HttpResponse response = client.execute(httpPost);
if(200 == response.getStatusLine().getStatusCode()){
InputStream is = response.getEntity().getContent();
String s = StreamTools.readInputStream(is);
return s;
} else {
return null;
}
}
優點:
(1).擁有衆多的API;
(2).實現比較穩定;
(3).bug數量也很少;
(4).web頁面訪問Session、Cookie的處理方便。
缺點:
(1).API數量過多,升級和擴展難;
(2).Android團隊在提升和優化HttpClient不積極。
在Android應用程序中,則可使用HttpClient來登錄系統,只要應用程序使用同一個HttpClient發送請求,HttpClient會自動維護與服務器之間的Session狀態,也就是說程序第一次使用HttpClient登錄系統後,接下來使用HttpClient即可訪問被保護頁而了。而HttpURLConnection處理session比較麻煩。
注意:原生態使用
(1)AsyncTask
android輕量級的異步類,繼承AsyncTask,在類中實現異步操作,並提供接口反饋當前異步執行的程度(可以通過接口實現UI進度更新),最後反饋執行的結果給UI主線程.
優點:
l 簡單,快捷
l 過程可控
缺點:
l 在使用多個異步操作和並需要進行Ui變更時,就變得複雜起來.
(2)Handler
在Handler 異步實現時,涉及到 Handler, Looper, Message,Thread四個對象,實現異步的流程是主線程啓動Thread(子線程)thread(子線程)運行並生成Message-Looper獲取Message並傳遞給Handler,Handler逐個獲取Looper中的Message,並進行UI變更。
優點:
l 結構清晰,功能定義明確
l 對於多個後臺任務時,簡單,清晰
缺點:
l 在單個後臺異步處理時,顯得代碼過多,結構過於複雜(相對性)
原生SDK,簡單易掌握,但是如果不進行封裝,容易寫出冗餘代碼。
這個時候,網絡通信框架應運而生。
3.封裝框架——AsyncHttpClient
在Android開發中,發送、處理http請求簡直太常見了,以至於我們的代碼裏到處充斥着各種HttpClient和與之相關又臭又長的代碼。AsyncHttpClient,把HTTP所有的通信細節全部封裝在了內部,我們只需要簡單調用幾行代碼就可以完成通信操作了。
AsyncHttpClient 是一個框架提供的庫 可以異步傳輸。針對Android在Apache的HttpClient基礎上構建的異步的callback-based。所有的請求全在UI線程之外發生,而callback發生在創建它的線程中,應用了Android的Handler發送消息機制。
public String userLogin(String username,String userpwd) {
AsyncHttpClient client = new AsyncHttpClient();
RequestParams params = new RequestParams();
params.put("username", username);
params.put("userpwd", userpwd);
client.get("http://xxx.com", params, new AsyncHttpResponseHandler() {
public void onSuccess(int statusCode, Header[] headers, String response) {
//處理返回來的信息
String s = StreamTools.readInputStream(response);
return s;
}
public void onFailure(int statusCode, Header[] headers, String responseBody, Throwable error) {
Log.d("ERROR", error);
}
}
);
}
(1). 創建一個AsyncHttpClient;
(2). (可選的)通過RequestParams對象設置請求參數;
(3). 調用AsyncHttpClient的某個get方法,傳遞你需要的(成功和失敗時)callback接口實現,一般都是匿名內部類,實現了AsyncHttpResponseHandler,類庫自己也提供了好些現成的response handler,你一般不需要自己創建一個。
但是沒有圖片下載接口
4.封裝框架——Universal-Image-Loader
一個開源的圖片異步加載類庫,該項目的目的是提供一個可重複使用的類庫爲異步圖像加載,緩存和顯示。它使得在界面上顯示網絡圖片的操作變得極度簡單,開發者不用關心如何從網絡上獲取圖片,也不用關
心開啓線程、回收圖片資源等細節,Universal-Image-Loader已經把一切都做好了。
Universal-Image-Loader兩種處理圖片的方式:
(1)loadimage
DisplayImageOptions,他可以配置一些圖片顯示的選項,比如圖片在加載中ImageView顯示的圖片,是否需要使用內存緩存,是否需要使用文件緩存等等。在回調方法onLoadingComplete()中將loadedImage設置到ImageView上面就行了。
(2)displayImage
displayImage()比使用loadImage()方便很多,也不需要添加ImageLoadingListener接口,我們也不需要手動設置ImageView顯示Bitmap對象,直接將ImageView作爲參數傳遞到displayImage()中就行了,圖片顯示的配置選項中,我們添加了一個圖片加載中ImageVIew上面顯示的圖片,以及圖片加載出現錯誤顯示的圖片。
不提供簡單http通信接口
5.整合框架——Volley
Android開發團隊也是意識到了有必要將HTTP的通信操作再進行簡單化,於是在2013年Google I/O大會上推出了一個新的網絡通信框架——Volley。Volley可以說是把AsyncHttpClient和Universal-Image-Loader的優點集於了一身,既可以像AsyncHttpClient一樣非常簡單地進行HTTP通信,也可以像Universal-Image-Loader一樣輕鬆加載網絡上的圖片.
在Google IO的演講上,其配圖是一幅發射火弓箭的圖,有點類似流星。特別適合處理數據量不大,但網絡通信頻繁,圖文應用.