弄明白android 網路庫之Volley(一)
1、Volley是什麼?
Volley是Google官方在2013 Android IO大會上推出的新網路通訊框架,
一個使得android網路通訊更加容易並且迅速的HTTP庫。它並且可以通過開放的AOSP倉庫進行使用。
它有以下特性:
(1)自動排程網路請求;
(2)支援多併發的網路連線;
(3)磁碟和記憶體響應快取使用標準HTTP快取特性;
(4)支援請求優先順序;
(5)取消請求API。你可以取消一個請求,或者你可以設定塊或取消的請求範圍;
(6)易於定製,例如,重試和補償;
(7)強大的排序,便於正確填充UI的從網路獲取而來的非同步資料;
(8)有除錯和跟蹤工具
它就是一個讓你更快捷更高效進行網路通訊的
Volley is notsuitable for large download or streaming operations, since Volley holds allresponses in memory during parsing. For large download operations, considerusing an alternative like DownloadManager.
如果你安裝有git,那麼可以通過下面命令來獲得
二、如何使用Volley?
1、使用Volley傳送一個簡單的請求:
Volley提供了一個方法來根據一個URL發起一個HTTP請求。只需要做以下5個步驟:
(1)下載volley.jar包,並加入到android工程的libs中;
(2)配置上網的許可權;
<uses-permission android:name="android.permission.INTERNET" >
(3)通過Volley的靜態方法新建一個請求佇列物件RequestQueue,這裡解釋下什麼是RequestQueue,從它的原始碼可以大概瞭解到它是擁有好幾個queue
/** The cache triage queue. */
privatefinalPriorityBlockingQueue<Request<?>> mCacheQueue =
newPriorityBlockingQueue<Request<?>>();
/** The queue of requests that are actually going out to the network. */
privatefinalPriorityBlockingQueue<Request<?>> mNetworkQueue =
newPriorityBlockingQueue<Request<?>>();
RequestQueue queue = Volley.newRequestQueue(this);
(4)提供一個URL,new一個StringRequest 物件;所謂StringRequest物件,在它原始碼註釋可知,它就一個是利用給定的URL作為一個String去檢索響應內容的封裝請求物件。
/**
* A canned request for retrieving the response body at a given URL as a String.
*/
publicclassStringRequestextendsRequest<String>{
privatefinalListener<String> mListener;
/**
* Creates a new request with the given method.
*
* @param method the request {@link Method} to use
* @param url URL to fetch the string at
* @param listener Listener to receive the String response
* @param errorListener Error listener, or null to ignore errors
*/
publicStringRequest(int method,String url,Listener<String> listener,
ErrorListener errorListener){
super(method, url, errorListener);
mListener= listener;
}
(5)並把它加入到RequestQueue佇列中。
queue.add(stringRequest);
官方所給出的提示DEMO如下:
final TextView mTextView = (TextView) findViewById(R.id.text);
...
// Instantiate the RequestQueue.
RequestQueue queue = Volley.newRequestQueue(this);
String url ="http://www.google.com";
// Request a string response from the provided URL.
StringRequest stringRequest = new StringRequest(Request.Method.GET, url,
new Response.Listener() {
@Override
public void onResponse(String response) {
// Display the first 500 characters of the response string.
mTextView.setText("Response is: "+ response.substring(0,500));
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
mTextView.setText("That didn't work!");
}
});
// Add the request to the RequestQueue.
queue.add(stringRequest);
2、使用JSON傳遞資料:JsonRequest,返回JSONObject或者JSONArray
兩個步驟:
(1)把你要提交給伺服器的東西封裝到一個JSONObject ,並新建一個JsonObjectRequest,使用RequestManager.addRequest(JsonObjectRequest,this);
把請求提交到佇列中去;
RequestManager.addRequest(new JsonObjectRequest(Method.GET, VolleyApi.JSON_TEST, null,
responseListener(), errorListener()),this);
(2)寫一個responseListener例項來接收處理伺服器返回的資訊;
privateResponse.Listener<JSONObject> responseListener() {
return new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
mTvResult.setText(response.toString());
}
};
}
執行以上程式碼就可以傳送一個JSON請求.
那麼 JsonObjectRequest是什麼呢?顧名思義,JSON物件請求。
public JsonObjectRequest(int method, String url, JSONObject jsonRequest,
Listener<JSONObject> listener, ErrorListener errorListener) {
super(method, url, (jsonRequest == null) ? null : jsonRequest.toString(), listener,
errorListener);
}
傳入引數有5個
method |
HTTP定義的與伺服器互動的方法,這裡有定義了7個方法 |
String url |
客戶端要訪問伺服器的地址 |
JSONObject jsonRequest |
客戶端訪問時要提交的資料,以JSON的形式 |
Listener<JSONObject> listener |
伺服器返回時的偵聽介面,回撥這個介面處理返回的JSONObject結果 |
ErrorListenererrorListener |
錯誤介面,回撥使用 |
從Method的原始碼可以看到,這裡就是HTTP的通訊方法,如果不太清楚下面幾個方法的用處:請看
public interface Method {
int DEPRECATED_GET_OR_POST = -1;
int GET = 0;
int POST = 1;
int PUT = 2;
int DELETE = 3;
int HEAD = 4;
int OPTIONS = 5;
int TRACE = 6;
int PATCH = 7;
}
而對於 兩個listener,分別是接收伺服器返回資訊與錯誤資訊的處理。應用的是Android回撥機制。
/** Callback interface for delivering parsed responses. */
public interface Listener<T> {
/** Called when a response is received. */
public void onResponse(T response);
}
/** Callback interface for delivering error responses. */
public interface ErrorListener {
/**
* Callback method that an error has been occurred with the
* provided error code and optional user-readable message.
*/
public void onErrorResponse(VolleyError error);
}
最後,上傳一個應用Volley的Demo,裡面簡單演示了volley網路通訊的過程,並且我加入了Volley的實現原始碼,可以對整個實現過程多加研究瞭解,從而懂得更多。