Android中Volley架構進行請求網路資料的使用_Android

來源:互聯網
上載者:User

問題的闡述:Android SDK中的HttpClient和HttpUrlConnection兩種請求方式用來處理網路的複雜的操作,但當應用比較複雜的時候需要我們編寫大量的代碼處理很多東西:映像緩衝,請求的調度等等;

解決:Volley就是為解決這些而生,它與2013年Google I/O大會上被提出:使得Android應用網路操作更方便更快捷;抽象了底層Http Client等實現的細節,讓開發人員更專註與產生RESTful Request。另外,Volley在不同的線程上非同步執行所有請求而避免了阻塞主線程。

Volley可以說是把AsyncHttpClient和Universal-Image-Loader的優點集於了一身,既可以像AsyncHttpClient一樣非常簡單地進行HTTP通訊,也可以像Universal-Image-Loader一樣輕鬆載入網路上的圖片。除了簡單易用之外,Volley在效能方面也進行了大幅度的調整,它的設計目標就是非常適合去進行資料量不大,但通訊頻繁的網路操作,而對於大資料量的網路操作,比如說下載檔案等,Volley的表現就會非常糟糕

1、Volley到底有哪些特點呢?

自動調度網路請求

多個並發的網路連接

通過使用標準的HTTP緩衝機制保持磁碟和記憶體響應的一致

支援要求優先順序

支援取消請求的強大API,可以取消單個請求或多個

易於定製

健壯性:便於正確的更新UI和擷取資料

包含調試和追蹤工具

2、Volley中的RequestQueue 和 Request

● RequestQueue 用來執行請求的請求隊列

● Request 用來構造一個請求對象

● Request對象主要有以下幾種類型:

a. StringRequest 響應的主體為字串

b. JsonArrayRequest 發送和接收JSON數組

c. JsonObjectRequest 發送和接收JSON對象

d. ImageRequest 發送和接收Image

3、Volley的使用步驟:

(1)建立一個Android項目,並匯入volley的jar包

(2)GET的請求方式:

//建立RequestQueue對象RequestQueue requestQueue = Volley.newRequestQueue(this);String url="http://api.m.panda.tv/ajax_get_all_subcate?__version=1.0.1.1300&__plat=android";//建立request對象StringRequest request=new StringRequest(url, new Response.Listener<String>() {/*** 請求成功的結果* @param response 這個參數就是訪問網路資料的結果*/@Overridepublic void onResponse(String response) {// }}, new Response.ErrorListener() {/*** 這個方法用來監聽訪問錯誤,展示的結果* 07-19 04:17:13.414: E/tag(1181): -------------* com.android.volley.VolleyError: * java.lang.SecurityException: * Permission denied (missing INTERNET permission?)==========================*/@Overridepublic void onErrorResponse(VolleyError error) {Log.e("tag","-------------"+ error+"==========================");}});//將Request對象添加到RequestQueue裡面。requestQueue.add(request);

(3)Post請求的方式:

通過指定要求方法為Request.Method.POST使其成為post請求,然後重新getParams方法佈建要求參數。當發出POST請求的時候,Volley會嘗試調用StringRequest的父類——Request中的getParams()方法來擷取POST參數。

//建立RequestQueue對象 RequestQueue requestQueue = Volley.newRequestQueue(this); String url=”http://api.m.panda.tv/ajax_get_all_subcate”; StringRequest request=new StringRequest(Request.Method.POST, url, new Response.Listener() {@Overridepublic void onResponse(String response) {Log.e("tag", "請求成功============"+response);}}, new Response.ErrorListener() {@Overridepublic void onErrorResponse(VolleyError error) {Log.e("tag", "請求成功============"+error);}}){/*** 重寫getParams方法設定參數,post添加參數的方法*/@Overrideprotected Map<String, String> getParams() throws AuthFailureError {HashMap<String, String> params = new HashMap<String,String>();params.put("__version", "1.0.1.1300");params.put("__plat", "android");return params;}};requestQueue.add(request);

(3)載入圖片的方式:

第一種載入圖片的方法

RequestQueue requestQueue = Volley.newRequestQueue(context);String img = datas.getImg();//第三第四個參數分別用於指定允許圖片最大的寬度和高度,如果指定的網狀圖片的寬度或高度大於這裡的最大值,則會對圖片進行壓縮,指定成0的話就表示不管圖片有多大,都不會進行壓縮。//第五個參數用於指定圖片的顏色屬性ImageRequest request=new ImageRequest(img, new Response.Listener<Bitmap>() {@Overridepublic void onResponse(Bitmap response) {holder.iv.setImageBitmap(response);}}, 0, 0,Bitmap.Config.ARGB_8888, new Response.ErrorListener() {@Overridepublic void onErrorResponse(VolleyError error) {// TODO Auto-generated method stub}});requestQueue.add(request);

第二種載入圖片的方法

其實載入圖片的功能還遠遠不止這些,使用ImageLoader可以實現對圖片的緩衝,還可以過濾重複的連結,避免發送重複的請求

ImageLoader的使用方法概括為以下幾步

1. 建立一個RequestQueue對象。

2. 建立一個ImageLoader對象。

3. 擷取一個ImageListener對象。

4. 調用ImageLoader的get()方法載入網路上的圖片。

//繼承ImageCache,使用LruCache實現緩衝public class BitmapCache implements ImageLoader.ImageCache {private LruCache<String, Bitmap> mCache;public BitmapCache() {int maxSize = 10 * 1024 * 1024;mCache = new LruCache<String, Bitmap>(maxSize) {@Overrideprotected int sizeOf(String key, Bitmap bitmap) {return bitmap.getRowBytes() * bitmap.getHeight();}};}@Overridepublic Bitmap getBitmap(String url) {return mCache.get(url);}@Overridepublic void putBitmap(String url, Bitmap bitmap) {mCache.put(url, bitmap);}}private void getImageByImageLoader() {ImageView iv= (ImageView) findViewById(R.id.iv);RequestQueue queue = Volley.newRequestQueue(getApplicationContext());String url = "https://www.baidu.com/img/bdlogo.png";ImageLoader loader=new ImageLoader(queue,new BitmapCache() );// 第一個參數指定用於顯示圖片的ImageView控制項// 第二個參數指定載入圖片的過程中顯示的圖片// 第三個參數指定載入圖片失敗的情況下顯示的圖片ImageLoader.ImageListener listener=ImageLoader.getImageListener(iv,R.mipmap.ic_launcher,R.mipmap.ic_launcher);// 調用ImageLoader的get()方法來載入圖片// 第一個參數就是圖片的URL地址// 第二個參數則是剛剛擷取到的ImageListener對象// 如果想對圖片的大小進行限制,也可以使用get()方法的重載,指定圖片允許的最大寬度和高度,即通過第三第四個參數指定loader.get(url,listener);}

第三種載入圖片的方法

最後,Volley提供了一種自訂ImageView來載入圖片,其使用方法可概括為

1. 建立一個RequestQueue對象。

2. 建立一個ImageLoader對象。

3. 在布局檔案中添加一個NetworkImageView控制項。

4. 在代碼中擷取該控制項的執行個體。

5. 設定要載入的圖片地址。

步驟一:我們在布局中申明該控制項

<com.android.volley.toolbox.NetworkImageViewandroid:id="@+id/network_image_view"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_centerInParent="true"/>

步驟二:在程式中實現載入

public void networkImageView(){RequestQueue queue = Volley.newRequestQueue(getApplicationContext());ImageLoader loader=new ImageLoader(queue,new BitmapCache() );NetworkImageView niv= (NetworkImageView) findViewById(R.id.network_image_view);niv.setDefaultImageResId(R.mipmap.ic_launcher);//設定載入中顯示的圖片niv.setErrorImageResId(R.mipmap.ic_launcher);//設定載入失敗時顯示的圖片niv.setImageUrl("https://www.baidu.com/img/bdlogo.png", loader);//設定靶心圖表片的URL地址}

4、自訂Request

在實際應用中,往往需要將http請求與json進行整合,而Volley正恰恰支援這樣的方式,不過需要我們自己自訂Request,這裡我們使用google的Gson庫進行整合。

1. 繼承Request類

2. 重寫parseNetworkResponse,實現json與實體類轉換,由於實體類未定,所以採用泛型
下文用到的json字串如下

{“name”:”lizhangqu”,”age”:16}

步驟一:

package cn.edu.zafu.http;import com.android.volley.NetworkResponse;import com.android.volley.ParseError;import com.android.volley.Request;import com.android.volley.Response;import com.android.volley.toolbox.HttpHeaderParser;import com.google.gson.Gson;import java.io.UnsupportedEncodingException;/*** Created by lizhangqu on 2015/5/7.*/public class GsonRequest<T> extends Request<T> {private final Response.Listener<T> mListener;private Gson mGson;private Class<T> mClass;public GsonRequest(int method, String url, Class<T> clazz, Response.Listener<T> listener,Response.ErrorListener errorListener) {super(method, url, errorListener);mGson = new Gson();mClass = clazz;mListener = listener;}public GsonRequest(String url, Class<T> clazz, Response.Listener<T> listener,Response.ErrorListener errorListener) {this(Method.GET, url, clazz, listener, errorListener);}@Overrideprotected Response<T> parseNetworkResponse(NetworkResponse response) {try {String jsonString = new String(response.data,HttpHeaderParser.parseCharset(response.headers));return Response.success(mGson.fromJson(jsonString, mClass),HttpHeaderParser.parseCacheHeaders(response));} catch (UnsupportedEncodingException e) {return Response.error(new ParseError(e));}}@Overrideprotected void deliverResponse(T response) {mListener.onResponse(response);}}

步驟二:編寫測試實體類,兩個欄位一個name一個age

package cn.edu.zafu.http;/*** Created by lizhangqu on 2015/5/7.*/public class Person {private String name;private int age;public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}@Overridepublic String toString() {return "Person{" +"name='" + name + '\'' +", age=" + age +'}';}}

步驟三:調用方法和StringRequest是一樣的。如下所示

private void json(){RequestQueue queue = Volley.newRequestQueue(getApplicationContext());String url = "http://121.41.119.107/test/index.php";GsonRequest<Person> request=new GsonRequest<Person>(url, Person.class, new Response.Listener<Person>() {@Overridepublic void onResponse(Person response) {Log.d("TAG",response.toString());}}, new Response.ErrorListener() {@Overridepublic void onErrorResponse(VolleyError error) {}});queue.add(request);}

以上所述是小編給大家介紹的Android中Volley架構進行請求網路資料的使用,希望對大家有所協助,如果大家有任何疑問請給我留言,小編會及時回複大家的。在此也非常感謝大家對雲棲社區網站的支援!

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.