Android中Volley框架進(jìn)行請(qǐng)求網(wǎng)絡(luò)數(shù)據(jù)的使用
問題的闡述:Android SDK中的HttpClient和HttpUrlConnection兩種請(qǐng)求方式用來處理網(wǎng)絡(luò)的復(fù)雜的操作,但當(dāng)應(yīng)用比較復(fù)雜的時(shí)候需要我們編寫大量的代碼處理很多東西:圖像緩存,請(qǐng)求的調(diào)度等等;
解決:Volley就是為解決這些而生,它與2013年Google I/O大會(huì)上被提出:使得Android應(yīng)用網(wǎng)絡(luò)操作更方便更快捷;抽象了底層Http Client等實(shí)現(xiàn)的細(xì)節(jié),讓開發(fā)者更專注與產(chǎn)生RESTful Request。另外,Volley在不同的線程上異步執(zhí)行所有請(qǐng)求而避免了阻塞主線程。
Volley可以說是把AsyncHttpClient和Universal-Image-Loader的優(yōu)點(diǎn)集于了一身,既可以像AsyncHttpClient一樣非常簡(jiǎn)單地進(jìn)行HTTP通信,也可以像Universal-Image-Loader一樣輕松加載網(wǎng)絡(luò)上的圖片。除了簡(jiǎn)單易用之外,Volley在性能方面也進(jìn)行了大幅度的調(diào)整,它的設(shè)計(jì)目標(biāo)就是非常適合去進(jìn)行數(shù)據(jù)量不大,但通信頻繁的網(wǎng)絡(luò)操作,而對(duì)于大數(shù)據(jù)量的網(wǎng)絡(luò)操作,比如說下載文件等,Volley的表現(xiàn)就會(huì)非常糟糕
1、Volley到底有哪些特點(diǎn)呢?
自動(dòng)調(diào)度網(wǎng)絡(luò)請(qǐng)求
多個(gè)并發(fā)的網(wǎng)絡(luò)連接
通過使用標(biāo)準(zhǔn)的HTTP緩存機(jī)制保持磁盤和內(nèi)存響應(yīng)的一致
支持請(qǐng)求優(yōu)先級(jí)
支持取消請(qǐng)求的強(qiáng)大API,可以取消單個(gè)請(qǐng)求或多個(gè)
易于定制
健壯性:便于正確的更新UI和獲取數(shù)據(jù)
包含調(diào)試和追蹤工具
2、Volley中的RequestQueue 和 Request
● RequestQueue 用來執(zhí)行請(qǐng)求的請(qǐng)求隊(duì)列
● Request 用來構(gòu)造一個(gè)請(qǐng)求對(duì)象
● Request對(duì)象主要有以下幾種類型:
a. StringRequest 響應(yīng)的主體為字符串
b. JsonArrayRequest 發(fā)送和接收J(rèn)SON數(shù)組
c. JsonObjectRequest 發(fā)送和接收J(rèn)SON對(duì)象
d. ImageRequest 發(fā)送和接收Image
3、Volley的使用步驟:
(1)創(chuàng)建一個(gè)Android項(xiàng)目,并導(dǎo)入volley的jar包
(2)GET的請(qǐng)求方式:
//創(chuàng)建RequestQueue對(duì)象 RequestQueue requestQueue = Volley.newRequestQueue(this); String url="http://api.m.panda.tv/ajax_get_all_subcate?__version=1.0.1.1300&__plat=android"; //創(chuàng)建request對(duì)象 StringRequest request=new StringRequest(url, new Response.Listener<String>() { /** * 請(qǐng)求成功的結(jié)果 * @param response 這個(gè)參數(shù)就是訪問網(wǎng)絡(luò)數(shù)據(jù)的結(jié)果 */ @Override public void onResponse(String response) { // } }, new Response.ErrorListener() { /** * 這個(gè)方法用來監(jiān)聽訪問錯(cuò)誤,展示的結(jié)果 * 07-19 04:17:13.414: E/tag(1181): ------------- * com.android.volley.VolleyError: * java.lang.SecurityException: * Permission denied (missing INTERNET permission?)========================== */ @Override public void onErrorResponse(VolleyError error) { Log.e("tag","-------------"+ error+"=========================="); } }); //將Request對(duì)象添加到RequestQueue里面。 requestQueue.add(request);
(3)Post請(qǐng)求的方式:
通過指定請(qǐng)求方法為Request.Method.POST使其成為post請(qǐng)求,然后重新getParams方法設(shè)置請(qǐng)求參數(shù)。當(dāng)發(fā)出POST請(qǐng)求的時(shí)候,Volley會(huì)嘗試調(diào)用StringRequest的父類——Request中的getParams()方法來獲取POST參數(shù)。
//創(chuàng)建RequestQueue對(duì)象 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() { @Override public void onResponse(String response) { Log.e("tag", "請(qǐng)求成功============"+response); } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { Log.e("tag", "請(qǐng)求成功============"+error); } }){ /** * 重寫getParams方法設(shè)置參數(shù),post添加參數(shù)的方法 */ @Override protected 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(); //第三第四個(gè)參數(shù)分別用于指定允許圖片最大的寬度和高度,如果指定的網(wǎng)絡(luò)圖片的寬度或高度大于這里的最大值,則會(huì)對(duì)圖片進(jìn)行壓縮,指定成0的話就表示不管圖片有多大,都不會(huì)進(jìn)行壓縮。 //第五個(gè)參數(shù)用于指定圖片的顏色屬性 ImageRequest request=new ImageRequest(img, new Response.Listener<Bitmap>() { @Override public void onResponse(Bitmap response) { holder.iv.setImageBitmap(response); } }, 0, 0,Bitmap.Config.ARGB_8888, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { // TODO Auto-generated method stub } }); requestQueue.add(request);
第二種加載圖片的方法
其實(shí)加載圖片的功能還遠(yuǎn)遠(yuǎn)不止這些,使用ImageLoader可以實(shí)現(xiàn)對(duì)圖片的緩存,還可以過濾重復(fù)鏈接,避免發(fā)送重復(fù)的請(qǐng)求
ImageLoader的使用方法概括為以下幾步
1. 創(chuàng)建一個(gè)RequestQueue對(duì)象。
2. 創(chuàng)建一個(gè)ImageLoader對(duì)象。
3. 獲取一個(gè)ImageListener對(duì)象。
4. 調(diào)用ImageLoader的get()方法加載網(wǎng)絡(luò)上的圖片。
//繼承ImageCache,使用LruCache實(shí)現(xiàn)緩存 public class BitmapCache implements ImageLoader.ImageCache { private LruCache<String, Bitmap> mCache; public BitmapCache() { int maxSize = 10 * 1024 * 1024; mCache = new LruCache<String, Bitmap>(maxSize) { @Override protected int sizeOf(String key, Bitmap bitmap) { return bitmap.getRowBytes() * bitmap.getHeight(); } }; } @Override public Bitmap getBitmap(String url) { return mCache.get(url); } @Override public 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() ); // 第一個(gè)參數(shù)指定用于顯示圖片的ImageView控件 // 第二個(gè)參數(shù)指定加載圖片的過程中顯示的圖片 // 第三個(gè)參數(shù)指定加載圖片失敗的情況下顯示的圖片 ImageLoader.ImageListener listener=ImageLoader.getImageListener(iv,R.mipmap.ic_launcher,R.mipmap.ic_launcher); // 調(diào)用ImageLoader的get()方法來加載圖片 // 第一個(gè)參數(shù)就是圖片的URL地址 // 第二個(gè)參數(shù)則是剛剛獲取到的ImageListener對(duì)象 // 如果想對(duì)圖片的大小進(jìn)行限制,也可以使用get()方法的重載,指定圖片允許的最大寬度和高度,即通過第三第四個(gè)參數(shù)指定 loader.get(url,listener); }
第三種加載圖片的方法
最后,Volley提供了一種自定義ImageView來加載圖片,其使用方法可概括為
1. 創(chuàng)建一個(gè)RequestQueue對(duì)象。
2. 創(chuàng)建一個(gè)ImageLoader對(duì)象。
3. 在布局文件中添加一個(gè)NetworkImageView控件。
4. 在代碼中獲取該控件的實(shí)例。
5. 設(shè)置要加載的圖片地址。
步驟一:我們?cè)诓季种猩昝髟摽丶?/p>
<com.android.volley.toolbox.NetworkImageView android:id="@+id/network_image_view" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerInParent="true" />
步驟二:在程序中實(shí)現(xiàn)加載
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);//設(shè)置加載中顯示的圖片 niv.setErrorImageResId(R.mipmap.ic_launcher);//設(shè)置加載失敗時(shí)顯示的圖片 niv.setImageUrl("https://www.baidu.com/img/bdlogo.png", loader);//設(shè)置目標(biāo)圖片的URL地址 }
4、自定義Request
在實(shí)際應(yīng)用中,往往需要將http請(qǐng)求與json進(jìn)行集成,而Volley正恰恰支持這樣的方式,不過需要我們自己自定義Request,這里我們使用google的Gson庫進(jìn)行集成。
1. 繼承Request類
2. 重寫parseNetworkResponse,實(shí)現(xiàn)json與實(shí)體類轉(zhuǎn)換,由于實(shí)體類未定,所以采用泛型
下文用到的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); } @Override protected 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)); } } @Override protected void deliverResponse(T response) { mListener.onResponse(response); } }
步驟二:編寫測(cè)試實(shí)體類,兩個(gè)字段一個(gè)name一個(gè)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; } @Override public String toString() { return "Person{" + "name='" + name + '\'' + ", age=" + age + '}'; } }
步驟三:調(diào)用方法和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>() { @Override public void onResponse(Person response) { Log.d("TAG",response.toString()); } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { } }); queue.add(request); }
以上所述是小編給大家介紹的Android中Volley框架進(jìn)行請(qǐng)求網(wǎng)絡(luò)數(shù)據(jù)的使用,希望對(duì)大家有所幫助,如果大家有任何疑問請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
- Android 中Volley二次封裝并實(shí)現(xiàn)網(wǎng)絡(luò)請(qǐng)求緩存
- Android Volley框架全面解析
- Android Volley框架使用方法詳解
- Android開發(fā)中使用Volley庫發(fā)送HTTP請(qǐng)求的實(shí)例教程
- Android的HTTP操作庫Volley的基本使用教程
- Android的HTTP類庫Volley入門學(xué)習(xí)教程
- Android Volley圖片加載功能詳解
- Android Volley框架使用源碼分享
- Android 開發(fā)中Volley詳解及實(shí)例
- Android中volley封裝實(shí)踐記錄
相關(guān)文章
Android GestureDetector用戶手勢(shì)檢測(cè)實(shí)例講解
這篇文章主要為大家詳細(xì)介紹了Android GestureDetector用戶手勢(shì)檢測(cè)實(shí)例,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-03-03Android開發(fā)中多進(jìn)程共享數(shù)據(jù)簡(jiǎn)析
這篇文章主要為大家簡(jiǎn)單分析Android開發(fā)中多進(jìn)程共享數(shù)據(jù),怎么做才能讓這兩邊共享數(shù)據(jù),感興趣的小伙伴們可以參考一下2016-04-04Android中使用IntentService創(chuàng)建后臺(tái)服務(wù)實(shí)例
這篇文章主要介紹了Android中使用IntentService創(chuàng)建后臺(tái)服務(wù)實(shí)例,IntentService提供了在單個(gè)后臺(tái)線程運(yùn)行操作的簡(jiǎn)單結(jié)構(gòu),需要的朋友可以參考下2014-06-06Android開發(fā)獲取傳感器數(shù)據(jù)的方法示例【加速度傳感器,磁場(chǎng)傳感器,光線傳感器,方向傳感器】
這篇文章主要介紹了Android開發(fā)獲取傳感器數(shù)據(jù)的方法,結(jié)合實(shí)例形式分析了Android獲取加速度傳感器、磁場(chǎng)傳感器、光線傳感器及方向傳感器數(shù)據(jù)的相關(guān)操作技巧,需要的朋友可以參考下2017-11-11Android?TextView跑馬燈實(shí)現(xiàn)原理及方法實(shí)例
字的跑馬燈效果在移動(dòng)端開發(fā)中是一個(gè)比較常見的需求場(chǎng)景,下面這篇文章主要給大家介紹了關(guān)于Android?TextView跑馬燈實(shí)現(xiàn)原理及方法的相關(guān)資料,需要的朋友可以參考下2022-05-05詳解Android自定義控件屬性TypedArray以及attrs
這篇文章主要為大家介紹了android自定義控件屬性TypedArray以及attrs,感興趣的小伙伴們可以參考一下2016-01-01Android捕捉錯(cuò)誤try catch 的簡(jiǎn)單使用教程
這篇文章主要介紹了Android捕捉錯(cuò)誤try catch 的簡(jiǎn)單使用,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-09-09