1. 程式人生 > >Adison's Notes

Adison's Notes

為什麼使用Volley

        Android提供了兩個HTTP庫給開發者來進行實現一個HTTP請求,一個是AndroidHttpClientapache HttpClient拓展而來),另一個是HttpUrlConnection。兩者都互有優缺點。當我們開發一個應用,一般來說,我們會寫一些Http連線類,這些類可以處理所有Http請求,建立後臺執行緒,管理執行緒池,解析response,快取response,處理異常狀態碼、SSL連線,實現並行或者序列請求。每一個開發者都有自己的方式去實現這些方法。有些人可能會用AsycnTask在後臺完成網路請求,有些人可能經過處理程式從UI執行緒建立

HTTP連線類,然後在工作執行緒執行網路操作,再使用處理程式解析HTTP response返回主執行緒。

但是我們最終會重複編寫相同的樣板程式碼,我們試圖在我們的應用程式重複造輪子。

例如,下面的程式碼片段,在AysncTaskdoBackground裡實現一個HTTP請求。當我們獲取response,把資料從HttpUrlConnection的輸入流拷貝到輸出流,然後把輸出流再轉化成我們最終想要的JsonObject。所有這些樣板程式碼在我們的程式碼中重複出現。


HttpURLConnection urlConnection = null;
try {
   URL url = new URL("http://www.android.com/");
   urlConnection = (HttpURLConnection) url.openConnection();
   InputStream in = new BufferedInputStream(urlConnection.getInputStream());
   ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
   byte[] buffer = new byte[1024]; // Adjust if you want
   int bytesRead;
   while ((bytesRead = in.read(buffer)) != -1) {
     outputStream.write(buffer, 0, bytesRead);
   }
   JSONObject resultJSON = new JSONObject(outputStream.toString());

}catch (Exception e) {
       e.printStackTrace();
} finally {
     urlConnection.disconnect();
}

所以谷歌提出volley,幫助開發人員處理相關的所有網路操作,這樣開發人員可以集中精力實現HTTP響應後的業務邏輯。從而可以更少的網路程式碼呼叫,這樣可以幫助開發者減少bug數量。

注意Volley在大檔案操作中並不很適用,如上傳/下載,這些case,還需要使用原始的方法

以下是Volley的一些關鍵特性:

Android提供更快的網路請求

在後臺執行緒中排程、並行實現所有HTTP請求並管理這些執行緒

提供靈活的方法來同步併發執行你的網路請求

帶有內建的Json解析器

 可以設定請求的優先順序

 為某些情況提供重試策略,如超時,內部伺服器錯誤

可以很靈活的取消請求

提供圖片的記憶體和磁碟快取,批量處理下載

可以很靈活的實現自己的快取

可以實現自己的HTTPStack(處理SSL連線,PATCH請求)

請求可以跟蹤除錯

可以和Activity和生命週期的聯動(Activity結束時同時取消所有網路請求)

整合Volley專案

 可以通過兩種方式整合

生成Volley.jar,放到libs目錄

volley專案作為一個library依賴

git資源庫Clone Volley專案:

使用Volley主要涉及連個類RequestQueueRequest

RequestQueue ---排程請求佇列並在工作執行緒執行請求,然後響應給主執行緒

Request---所有的網路請求都可以通過此類來建立,它提供了一個HTTP請求所需的主要引數,譬如:

  請求型別-GETPOSTPUTDELETE

  URL

  請求資料(HTTP Body

  成功響應監聽

  錯誤監聽

簡單使用

初始化RequestQueue


 JsonObjectRequest


StringRequest


GsonRequest

 當然你也可以自定義Request,使得其可以返回對應的Java型別。譬如,我們可以用Gson來自定義一個Request



使用的時候和StringRequest和JsonObjectRequest差不多