Android 谷歌 開源 通信框架 VOLLEY(一)

  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的演講上,其配圖是一幅發射火弓箭的圖,有點類似流星。特別適合處理數據量不大,但網絡通信頻繁,圖文應用.
這裏寫圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章