日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Volley框架的使用

發布時間:2024/1/1 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Volley框架的使用 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

所謂Volley,它是2013年Google I/O上發布的一款網絡框架,基于Android平臺,能使網絡通信更快,更簡單,更健全。

它的優點:(1)默認Android2.3及以上基于HttpURLConnection,2.3以下使用基于HttpClient;(2)符合Http 緩存語義 的緩存機制(提供了默認的磁盤和內存等緩存);(3)請求隊列的優先級排序;(4)提供多樣的取消機制;(5)提供簡便的圖片加載工具(其實圖片的加載才是我們最為看重的功能);(6)一個優秀的框架。

不足之處也有:它只適合數據量小,通信頻繁的網絡操作,如果是數據量大的,像音頻,視頻等的傳輸,還是不要使用Volley的為好。

一、獲得Volley

可以直接從google上git clone下來

git clone https://android.googlesource.com/platform/frameworks/volley

然后生成jar包,導入到自己的項目中使用。注意,這個庫要求最低SDK版本為Froyo,即至少要設置android:minSdkVersion為8以上。

不過由于google的被墻,所以可能要FQ出去。嫌麻煩的話也可以直接問我要jar包。

二、使用Volley

volley里面自帶了很多的工具類,像StringRequest,JsonArrayRequest,JsonObjectRequest,ImageRequest,ClearCacheRequest,這些都是我們平時經常使用的http請求,我們就可以直接把它們拿過來用。現在來一一說明這些類的用法吧。

在此之前,先說一下Volley中的requestQueue吧,所有的request申請出來后都是扔到這個隊列里處理。

requestQueue = Volley.newRequestQueue(context.getApplicationContext()); ... requestQueue.add(request);

這樣Volley就會幫你處理網絡通信了。

(1)字符數據的處理

  • StringRequest 網絡請求返回字符串
  • StringRequest的網絡請求返回的是一個字符串。它有兩個構造函數

    /*** 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*/public StringRequest(int method, String url, Listener<String> listener,ErrorListener errorListener) {super(method, url, errorListener);mListener = listener;}/*** Creates a new GET request.** @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*/public StringRequest(String url, Listener<String> listener, ErrorListener errorListener) {this(Method.GET, url, listener, errorListener);}

    第二個構造函數相比第一個少了個method的參數,所以它是默認使用get方法。第一個構造函數是可以讓我們自己定義請求的方式,method的類型定義在Request類中

    /*** Supported request methods.*/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;}

    默認是get,而除此以外我們使用最多的是post的請求方法。

    Get請求:

    StringRequest request = new StringRequest( "http://www.baidu.com/", new Response.Listener<String>() { @Override public void onResponse(String arg0) { //收到成功應答后會觸發這里 } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError volleyError) { //出現連接錯誤會觸發這里 } } );

    在StringRequest中傳入一個url,一個通信成功的觸發器和一個通信失敗的觸發器。
    而post的請求方式如下:

    StringRequest request = new StringRequest( Request.Method.POST, "http://xxx.xxx.xxx", new Response.Listener<String>() { @Override public void onResponse(String s) { } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError volleyError) { } } ) { @Override public Map<String, String> getHeaders() throws AuthFailureError { //設置頭信息 Map<String, String> map = new HashMap<String, String>(); map.put("Content-Type", "application/x-www-form-urldecoded"); return map; } @Override protected Map<String, String> getParams() throws AuthFailureError { //設置參數 Map<String, String> map = new HashMap<String, String>(); map.put("name", "cpacm"); map.put("password", "12345"); return map; } };

    可以通過復寫里面的方法把數據給傳進去,不止如此,如果還想對返回的數據進行進一步的處理,可以在重寫下面這個方法

    /*** 可以對返回的reponse做處理, NetworkResponse里面包括狀態碼,頭信息,內容數據,是否緩存在本地,花費的時間(ms)等內容**/@Overrideprotected Response<String> parseNetworkResponse(NetworkResponse response) {// 比如下面的例子是取頭信息里的cookie數據/** String mCookie; * for (String s : response.headers.keySet()) {* if (s.contains("Set-Cookie")) { mCookie =* response.headers.get(s); break; } }*/return super.parseNetworkResponse(response);}

    與前面兩個重寫方法在通信前調用不同,這個方法是在通信結束后調用的。
    StringRequest的內容就那么多,不是很理解的話可以參考示例來仔細琢磨…

  • JsonObjectRequest json格式的數據通信
    JsonArrayRequest是專對于jsonArray的處理,而JsonObjectRequest是對jsonObject的處理,所以兩個區別不大,所以我這里就主要介紹JsonObjectRequest的使用。
    事實上,使用的方法和StringRequest并沒有什么大的區別,舉一反三嘛。
  • JsonObjectRequest的構造函數也是有兩個,不過內容與StringRequest有一點不同。

    public JsonObjectRequest(int method, String url, JSONObject jsonRequest, Listener<JSONObject> listener, ErrorListener errorListener) public JsonObjectRequest(String url, JSONObject jsonRequest, Listener<JSONObject> listener, ErrorListener errorListener)

    第一個構造函數的參數分別為 請求方法,url地址,附帶的jsonObject數據,成功監聽器,失敗監聽器。

    第二個構造函數比第一個少了method的參數,它默認的規則是:當jsonRequest為空時,使用get請求方式,不為空則是使用post方式。

    由于構造函數中已經有了數據傳遞的參數,所以不必在重寫getParams()的方法了(重寫了也沒用)。
    基本的調用方法:

    JsonObjectRequest request = new JsonObjectRequest( "http://xxx.xxx.xx", jsonObject, new Response.Listener<JSONObject>() { @Override public void onResponse(JSONObject jsonObject) { } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError volleyError) { } } ) { @Override public Map<String, String> getHeaders() throws AuthFailureError { Map<String, String> map = new HashMap<String, String>(); map.put("Cookie", mCookie); return map; } };

    最后只要再把成功監聽器里拿到的數據處理就能使用了。

    post傳到服務器上時已經是json格式,接著在服務器里處理,返回的也要是json格式的數據,否則會導致數據錯誤(無法轉化成JSONObject格式)。
    (!所以我用php寫的后臺來接受數據時,無法用$_POST來接收上傳的數據)
    最后,別忘了把這些請求加到隊列中。

    requestQueue.add(request);

    (2)圖片數據的處理

  • ImageRequest 圖片請求
  • ImageRequest與前面的request用法差不多,都是把請求扔到RequestQueue隊列里。

    ImageRequest imageRequest = new ImageRequest(url,new Listener<Bitmap>() {@Overridepublic void onResponse(Bitmap bitmap) {// TODO Auto-generated method stub }}, maxWidth, maxHeight, decodeConfig, new ErrorListener() {@Overridepublic void onErrorResponse(VolleyError arg0) {// TODO Auto-generated method stubLog.e(TAG, "ErrorStatus: " + arg0.toString());}});

    可以看到,ImageRequest的構造函數能接收六個參數,第一個參數就是圖片的URL地址。第二個參數是圖片請求成功的回調, 這里我們可以把返回的Bitmap參數設置到ImageView中。第三第四個參數分別用于指定允許圖片最大的寬度和高度,如果指定的網絡圖片的寬度或高度大于這里的最大值,則會對圖片進行壓縮,指定成0的話就表示不管圖片有多大,都不會進行壓縮。第五個參數用于指定圖片的顏色屬性,Bitmap.Config下的幾個常量都可以在這里使用,其中ARGB_8888可以展示最好的顏色屬性,每個圖片像素占據4個字節的大小,而 RGB_565則表示每個圖片像素占據2個字節大小。第六個參數是圖片請求失敗的回調,這里我們可以在請求失敗時在ImageView中顯示一張默認圖片。

    最后,把請求放入隊列中。

    requestQueue.add(request);
  • ImageLoader 更加強大的網絡圖片請求
  • ImageLoader也可以用于加載網絡上的圖片,并且它的內部也是使用ImageRequest來實現的,不過ImageLoader明顯要比ImageRequest更加高效,因為它不僅可以幫我們對圖片進行緩存,還可以過濾掉重復的鏈接,避免重復發送請求。直接上代碼吧

    ImageLoader imageLoader = new ImageLoader(requestQueue,new BitmapCache());//新建一個ImageLoader,傳入requestQueue和圖片緩存類ImageListener listener = ImageLoader.getImageListener(imageView,default_image, failed_image);//參數分別為要顯示的圖片控件,默認顯示的圖片(用于圖片未下載完時顯示),下載圖片失敗時顯示的圖片imageLoader.get(url, listener, maxWidth, maxHeight);//開始請求網絡圖片

    可以看到,ImageLoader的構造函數接收兩個參數,第一個參數就是RequestQueue對象,第二個參數是一個ImageCache對象,我們通過調用ImageLoader的getImageListener()方法能夠獲取到一個ImageListener對象,getImageListener()方法接收三個參數,第一個參數指定用于顯示圖片的ImageView控件,第二個參數指定加載圖片的過程中顯示的圖片,第三個參數指定加載圖片失敗的情況下顯示的圖片。最后,調用ImageLoader的get()方法來加載圖片。
    圖片緩存類代碼如下:

    public class BitmapCache implements ImageCache {private LruCache<String, Bitmap> mCache;public BitmapCache() {int maxSize = 10 * 1024 * 1024;// 10M的緩存mCache = new LruCache<String, Bitmap>(maxSize) {@Overrideprotected int sizeOf(String key, Bitmap bitmap) {return bitmap.getRowBytes() * bitmap.getHeight();}};}@Overridepublic Bitmap getBitmap(String url) {// TODO Auto-generated method stubreturn mCache.get(url);}@Overridepublic void putBitmap(String url, Bitmap bitmap) {// TODO Auto-generated method stubmCache.put(url, bitmap);}}
  • NetworkImageView 網絡圖片加載控件
    除了上面的兩種加載圖片以外,volley還提供了一個繼承ImageView的控件給我們使用。我們可以把NetworkImageView控件放入布局文件中然后就能調用了。
  • <com.android.volley.toolbox.NetworkImageView android:id="@+id/network_image_view" android:layout_width="200dp" android:layout_height="200dp" android:layout_gravity="center_horizontal" />

    先從布局中獲得控件的控制權,

    networkImageView = (NetworkImageView) findViewById(R.id.network_image_view);

    最后在設置一些相關的屬性

    networkImageView.setDefaultImageResId(R.drawable.default_image); networkImageView.setErrorImageResId(R.drawable.failed_image); networkImageView.setImageUrl(url,imageLoader);

    setImageUrl()方法接收兩個參數,第一個參數用于指定圖片的URL地址,第二個參數則是前面創建好的ImageLoader對象。其中的imageLoader需要我們自己創建(就是上一個圖片加載方法的imageLoader),將其作為參數傳進去。其實NetworkImageView控件和用ImageLoader加載圖片性質上都是一樣的。

    (3)自定義數據的處理

    自定義的網絡請求可以繼承volley的Request類來重寫,比如說XML格式的請求。其中最重要的是Request類中的parseNetworkResponse方法。

    像StringRequest中的parseNetworkResponse方法

    String parsed;try {parsed = new String(response.data, HttpHeaderParser.parseCharset(response.headers));} catch (UnsupportedEncodingException e) {parsed = new String(response.data);}return Response.success(parsed, HttpHeaderParser.parseCacheHeaders(response));

    重點是怎么將response.data轉化成相應的字符格式。

    像JsonObject里面的方法

    @Overrideprotected Response<JSONObject> parseNetworkResponse(NetworkResponse response) {try {String jsonString =new String(response.data, HttpHeaderParser.parseCharset(response.headers));return Response.success(new JSONObject(jsonString),HttpHeaderParser.parseCacheHeaders(response));} catch (UnsupportedEncodingException e) {return Response.error(new ParseError(e));} catch (JSONException je) {return Response.error(new ParseError(je));}}

    先將傳過來的數據轉化成String格式,再根據情況轉成Json或者是XML。
    如我們自定義的XMLRequest可以寫成這樣子。

    @Overrideprotected Response<XmlPullParser> parseNetworkResponse(NetworkResponse response) {try {String xmlString = new String(response.data, HttpHeaderParser.parseCharset(response.headers));XmlPullParserFactory factory = XmlPullParserFactory.newInstance();XmlPullParser xmlPullParser = factory.newPullParser();xmlPullParser.setInput(new StringReader(xmlString));return Response.success(xmlPullParser, HttpHeaderParser.parseCacheHeaders(response));} catch (UnsupportedEncodingException e) {return Response.error(new ParseError(e));} catch (XmlPullParserException e) {return Response.error(new ParseError(e));}}

    三、結束語

    Volley給我們在網絡傳輸的方面提供了很大的方便,尤其是網絡圖片加載的部分。除此之外,我們可以從volley的源代碼入手可以學習到更多的知識,比如說如何構建一個完善的框架,如何使框架具有良好的擴展性。所以我建議有空的話可以把源代碼下載過來仔細體味一番…

    源碼的分析在下面的文章鏈接中。

    參考文章:
    (1) Android Volley完全解析 http://blog.csdn.net/guolin_blog/article/details/17482095
    (2)Android應用開發:網絡工具——Volley(一) http://blog.csdn.net/airk000/article/details/38983051
    (3)Android應用開發:網絡工具——Volley(二) http://blog.csdn.net/airk000/article/details/39003587
    (4)github上的volley庫分析 https://github.com/android-cn/android-open-project-analysis/tree/master/volley

    Demo地址:這是github上一個開源分析項目(@android-cn)里面一位成員(@grumoon,包括上面的volley庫分析)所寫的一個volley demo地址 https://github.com/android-cn/android-open-project-demo/tree/master/volley-demo

    ========================================

    作者:cpacm

    地址:http://www.cnblogs.com/cpacm/p/4193011.html

    總結

    以上是生活随笔為你收集整理的Volley框架的使用的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。