網絡請求庫Volley

 

  1. 介紹
  2. Volley下載地址
  3. 建立RequestQueue
  4. 使用RequestQueue
  5. Post請求
  6. 取消請求
  7. 請求的優先級

 

一、介紹

一般Volley只會用到兩個類RequestQueue 和Request,首先建立一個RequestQueue,RequestQueue管理工做線程並將解析的結果發送給主線程。而後傳遞一個或者多個Request 對象給他。html

Request 的構造函數的參數包含請求類型(GET, POST, 等等)、數據源的url、以及事件監聽者。根據請求類型的不一樣,可能還須要一些其餘的參數。android

 

二、Volley下載地址

三、建立RequestQueue

public class MarsWeather extends Application {
  
    private RequestQueue mRequestQueue;
    private static MarsWeather mInstance;
  
    @Override
    public void onCreate() {
        super.onCreate();
        mInstance = this;
        mRequestQueue = Volley.newRequestQueue(getApplicationContext());
    }
  
    public static synchronized MarsWeather getInstance() {
        return mInstance;
    }

    public static final String TAG = MarsWeather.class.getName();

    public RequestQueue getRequestQueue() {
        return mRequestQueue;
    }
  
    public <T> void add(Request<T> req) {
        req.setTag(TAG);// TAG能夠是任意值
        getRequestQueue().add(req);
    }
  
    public void cancel() {
        mRequestQueue.cancelAll(TAG);
    }
      
}

 

四、使用RequestQueue 

Volley實現了三種常見的請求類型:json

  • StringRequest
  • JsonRequest
  • ImageRequest
4.1 StringRequest 
String url = "http://httpbin.org/html"; // Request a string response
StringRequest stringRequest = new StringRequest(Request.Method.GET, url, new Response.Listener<String>() { @Override public void onResponse(String response) { // 請求響應成功 
        System.out.println(response.substring(0,100)); } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { // 請求失敗
        System.out.println("Something went wrong!"); error.printStackTrace(); } }); // Add the request to the queue
Volley.newRequestQueue(this).add(stringRequest);
 
4.2 JsonRequest
String url = "http://httpbin.org/get?site=code&network=tutsplus"; JsonObjectRequest jsonRequest = new JsonObjectRequest (Request.Method.GET, url, null, new Response.Listener<JSONObject>() { @Override public void onResponse(JSONObject response) { // the response is already constructed as a JSONObject!
                try { response = response.getJSONObject("args"); String site = response.getString("site"), network = response.getString("network"); System.out.println("Site: "+site+"\nNetwork: "+network); } catch (JSONException e) { e.printStackTrace(); } } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { error.printStackTrace(); } }); Volley.newRequestQueue(this).add(jsonRequest);

若是你須要,還能夠請求JSONArray ,只需用JsonArrayRequest 替代JsonObjectRequest就能夠了。緩存

 

4.3 ImageRequest

由於是請求圖片,因此沒有http類型參數,圖片請求老是get的。有三種請求圖片的方法。網絡

4.3.1.ImageRequest。經過提供的Url,她將你請求的圖片顯示在一個普通的ImageView中。壓縮與大小調整的操做都發生在工做線程中。app

String url = "http://i.imgur.com/Nwk25LA.jpg";
mImageView = (ImageView) findViewById(R.id.image);
  
ImageRequest imgRequest = new ImageRequest(url,
        new Response.Listener<Bitmap>() {
    @Override
    public void onResponse(Bitmap response) {
        mImageView.setImageBitmap(response);
    }
}, 0, 0, ImageView.ScaleType.FIT_XY, Bitmap.Config.ARGB_8888, new Response.ErrorListener() {
    @Override
    public void onErrorResponse(VolleyError error) {
        mImageView.setBackgroundColor(Color.parseColor("#ff0000"));
        error.printStackTrace();
    }
});
Volley.newRequestQueue(
this).add(imgRequest);

第一個參數是圖片的url,第二個是結果的listener,第3、第四個參數是maxWidth(最大寬度) 和 maxHeight(最大高度),能夠設置爲0來忽略他們。而後是用於計算圖片所需大小的ScaleType,而後是用於指定圖片壓縮方式的參數,我建議老是使用 Bitmap.Config.ARGB_8888,最後是一個錯誤listener。maven

注:Volley默認會將這種請求的優先級設置爲low。ide

@Override
public Priority getPriority() {
    return Priority.LOW;
}

 

4.3.2ImageLoader類。你能夠將之想象成數量龐大的ImageRequests,好比生成一個帶有圖片的ListView。函數

// ImageLoader這個類須要一個Request的實例以及一個ImageCache的實例,可是Volley並無提供默認的實現

RequestQueue mRequestQueue = Volley.newRequestQueue(this);
final LruCache<String, Bitmap> mImageCache = new LruCache<String, Bitmap>(20);
ImageCache imageCache = new ImageCache() {
    @Override
    public void putBitmap(String key, Bitmap value) {
        mImageCache.put(key, value);
    }

    @Override
    public Bitmap getBitmap(String key) {
       return mImageCache.get(key);
    }
};
ImageLoader mImageLoader
= new ImageLoader(mRequestQueue, imageCache); // imageView是一個ImageView實例 // ImageLoader.getImageListener的第二個參數是默認的圖片resource id // 第三個參數是請求失敗時候的資源id,能夠指定爲0 ImageListener listener = ImageLoader.getImageListener(imageView, android.R.drawable.ic_menu_rotate,android.R.drawable.ic_delete); mImageLoader.get(url, listener);// 這個方法會去加載圖片

 

4.3.3NetworkImageView。post

// 繼承自ImageView
public class NetworkImageView extends ImageView

// 添加了一個setImageUrl方法,參數包含一個Url地址和一個ImageLoader對象,ImageLoader可參照上面的
public void setImageUrl(String url, ImageLoader imageLoader) {}  

// 核心方法
private void loadImageIfNecessary(final boolean isInLayoutPass){
    // 內部實現,boolean 類型參數表明是否從新請求網絡 ,true:從新請求 false:取緩存
    // 內部實現和ImageLoader相似,都是經過ImageContainer中new一個ImageListener,在ImageListener,只是作了Url的空判斷,若是Url爲null,則調用ImageContainer.cancelRequest();取消請求。
}  

網絡請求下載圖片顯示,可使用此控件,比傳統的ImageView多了網絡處理,也添加了2個方法,設置開始下載的默認圖和下載出錯後顯示圖。

public void setDefaultImageResId(int defaultImage) {  
  mDefaultImageId = defaultImage;  
}  

public void setErrorImageResId(int errorImage) {  
  mErrorImageId = errorImage;  
} 

 

五、Post請求

從get請求切換到post請求是很是簡單的。你只須要在request的構造方法中改變Request.Method,同時重寫getParams方法,返回包含請求參數的Map<String, String>。

String url = "http://httpbin.org/post"; StringRequest postRequest = new StringRequest(Request.Method.POST, url, new Response.Listener<String>() { @Override public void onResponse(String response) { try { JSONObject jsonResponse = new JSONObject(response).getJSONObject("form"); String site = jsonResponse.getString("site"), network = jsonResponse.getString("network"); System.out.println("Site: "+site+"\nNetwork: "+network); } catch (JSONException e) { e.printStackTrace(); } } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { error.printStackTrace(); } }
 ) { @Override
protected Map<String, String> getParams() { Map<String, String> params = new HashMap<>(); // 這裏返回post參數: params.put("site", "code"); params.put("network", "tutsplus"); return params; } }; Volley.newRequestQueue(this).add(postRequest);

 

六、取消請求

若是你想取消全部的請求,在onStop方法中添加以下代碼:

@Override protected void onStop() { super.onStop(); mRequestQueue.cancelAll(new RequestQueue.RequestFilter() { @Override public boolean apply(Request<?> request) { // do I have to cancel this?
            return true; // -> always yes
 } }); }

還能夠根據TAG來取消請求。例如在構造GET請求的時候,設置一個TAG:

request.setTag("GET"); mRequestQueue.add(request);

取消TAG爲"GET"的請求

mRequestQueue.cancelAll("GET"); // 假設你已經有了一個RequestQueue變量

 

七、Request的優先級

默認狀況下,Volley將請求的優先級設置爲普通。通常這也沒什麼問題,然而在咱們的應用中,兩種請求的差異很大,有必要讓它們在隊列中有不一樣的優先級。就須要重寫一個Request

public class CustomJsonRequest extends JsonObjectRequest {
  
    public CustomJsonRequest(int method, String url, JSONObject jsonRequest,
                             Response.Listener<JSONObject> listener, Response.ErrorListener errorListener) {
        super(method, url, jsonRequest, listener, errorListener);
    }
  
    private Priority mPriority;
  
    public void setPriority(Priority priority) {
        mPriority = priority;
    }
  
    @Override
    public Priority getPriority() {
        return mPriority == null ? Priority.NORMAL : mPriority;
    }
}
CustomJsonRequest request = new CustomJsonRequest(Request.Method.GET, RECENT_API_ENDPOINT, null, null, null);
// 爲了節簡代碼,方便演示setPriority方法,我將上面的listener所有設爲null了

request.setPriority(Request.Priority.HIGH); Volley.newRequestQueue(getApplicationContext());.add(request);
優先級列表
Priority.LOW // images, thumbnails, ...
Priority.NORMAL // residual
Priority.HIGH // descriptions, lists, ...
Priority.IMMEDIATE // login, logout, ...
相關文章
相關標籤/搜索