国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > Android > 正文

Android中Volley框架進行請求網絡數據的使用

2019-12-12 04:55:39
字體:
來源:轉載
供稿:網友

問題的闡述: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框架進行請求網絡數據的使用,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對武林網網站的支持!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 盘锦市| 天津市| 临夏县| 濮阳市| 东城区| 沁源县| 淮阳县| 峨眉山市| 唐山市| 县级市| 司法| 措勤县| 仁寿县| 工布江达县| 仲巴县| 翼城县| 潮州市| 西盟| 威信县| 佛坪县| 广宁县| 枣阳市| 元氏县| 灌南县| 靖西县| 菏泽市| 瓦房店市| 乐东| 天柱县| 永德县| 固原市| 温州市| 五寨县| 南昌县| 长顺县| 普定县| 永福县| 内江市| 安西县| 横峰县| 无棣县|