1. 程式人生 > >Android Volley框架使用詳解

Android Volley框架使用詳解

Volley瞭解

Volley的中文翻譯為“齊射、併發”,是在2013年的Google大會上釋出的一款Android平臺網路通訊庫,具有網路請求的處理、小圖片的非同步載入和快取等功能,能夠幫助 Android APP 更方便地執行網路操作,而且更快速高效。

在Google IO的演講上,其配圖是一幅發射火弓箭的圖,有點類似流星。這表示,Volley特別適合資料量不大但是通訊頻繁的場景。見下圖:
Volley

而對於大資料量的網路操作,比如說下載檔案等,Volley的表現就會非常糟糕。

下圖所示的這些應用都是屬於資料量不大,但網路通訊頻繁的,因此非常適合使用Volley。
Volley



Volley 的優點:

  • 自動排程網路請求;
  • 高併發網路連線;
  • 通過標準的 HTTP cache coherence(快取記憶體一致性)快取磁碟和內 存透明的響應;
  • 支援指定請求的優先順序;
  • 網路請求cancel機制。我們可以取消單個請求,或者指定取消請求佇列中的一個區域;
  • 框架容易被定製,例如,定製重試或者回退功能;
  • 包含了除錯與追蹤工具;

下載&配置

  • Eclipse的使用者:
    下載到github上或者maven上下載Volley的jar包volley.jar,放在libs資料夾內;

  • Android Studio的使用者:
    build.gradle中加入:

 compile 'com
.mcxiaoke.volley:library:1.0.19'

Volley的使用

1、StringRequest(字串請求)

GET請求

//1.創建出請求佇列
RequestQueue mRequestQueue = Volley.newRequestQueue(this);

//2.創建出來字串請求物件: StringRequest
    /**
    * 1param: 請求方式 get/post
    * 2p:請求的url地址
    * 3p:請求成功後的介面回撥
    * 4p:請求失敗後回撥
    * 5p:成功的監聽,通過引數返回請求到的資料
    * 6p:失敗的監聽,失敗在這裡處理
    */
StringRequest mStrReq = new StringRequest(Request.Method.GET, "https://www.baidu.com", new Response.Listener<String>() { @Override public void onResponse(String response) { // 這個方法執行在主執行緒中,可以直接更新ui // 通過引數返回請求到的資料 mTv_result.setText(response); Toast.makeText(StrReqActivity.this, "下載成功", Toast.LENGTH_SHORT).show(); } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { // 這個方法執行在主執行緒中,可以直接更新ui // 失敗在這裡處理 Toast.makeText(StrReqActivity.this, "下載失敗", Toast.LENGTH_SHORT).show(); } }); //設定Tag值 mStrReq.setTag("100"); btn_req.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { //3.把請求物件新增到請求佇列中,會自動發出請求 mRequestQueue.add(mStrReq); } });

POST請求

String url_post = "http://zhushou.72g.com/app/gift/gift_list/";
StringRequest mStrReq = new StringRequest(Request.Method.POST, url_post
    , new Response.Listener<String>() {
        @Override
        public void onResponse(String response) {
            //
        }
    }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {
            //
        }
    }) {//這裡需要重寫getParams方法 
       @Override
       protected Map<String, String> getParams() throws AuthFailureError {
           //把post的請求引數,放入請求體中
           //請求條件:platform=2&gifttype=1&compare=60841c5b7c69a1bbb3f06536ed685a48
           Map<String, String> params = new HashMap<>();
           params.put("platform", "2");
           params.put("gifttype", "1");
           params.put("compare", "60841c5b7c69a1bbb3f06536ed685a48");
           return params;
        }
    };
    //點選加入到請求佇列中
    btn_req_json.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            mRequestQueue.add(mStrReq);
        }
   });

附:
Volley支援手動/自動取消請求,可以在Activity銷燬的時候手動取消請求:

@Override
protected void onDestroy() {
    super.onDestroy();
    //取消請求:有三種方式
    //1. 取消對應的請求物件
    mStrReq.cancel();
    //2. 取消請求佇列中對應tag的請求
    //mRequestQueue.cancelAll("100");
    //3. 取消請求佇列中所有的請求
    //mRequestQueue.cancelAll(this);
}

2、JsonObjectRequest與JsonArrayRequest(json資料請求)

JsonObjectRequest請求(一樣要加到請求佇列中才會自動載入)返回的是一個JSONObject物件,建立方法如下:

JsonObjectRequest jsonObjectRequest =new JsonObjectRequest(Request.Method.GET, url, new Response.Listener<JSONObject>() {
            @Override
            public void onResponse(JSONObject response) {

            }
        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {

            }
        });

3、ImageRequest圖片請求

//1.首先有請求佇列
RequestQueue requestQueue = Volley.newRequestQueue(this);
//2.請求物件
//1) 圖片下載的url
//2) 下載成功後,返回一個bitmap物件
//3)4) 最大寬度和最大高度,如果超過最大寬度和高度,會進行壓縮到你設定的寬度和高度,0不限制
//5) 圖片載入的形式
//6)圖片顯示的質量:RGB_565: 每個畫素2位元組   ARGB_8888:每個畫素佔4個位元組
//7)下載圖片失敗後,在這裡邊處理
ImageRequest imgRequest = new ImageRequest(url_img, new Response.Listener<Bitmap>() {
            @Override
            public void onResponse(Bitmap response) {
                //顯示成功的圖片
                iv_show.setImageBitmap(response);
            }
        }, 0, 0, ImageView.ScaleType.FIT_XY, Bitmap.Config.RGB_565, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                //設定失敗的圖片
                iv_show.setBackgroundResource(R.mipmap.ic_launcher);
            }
        });

4、ImageLoader圖片載入

//1、首先有請求佇列
RequestQueue requestQueue = Volley.newRequestQueue(this);
//2、創建出ImageLoader物件
ImageLoader loader = new ImageLoader(requestQueue, new BitmapCache());
//3、呼叫ImageLoader的get方法設定圖片
//getImageListener中的三個引數:1,下載好的圖片設定給哪個控制元件 2,預設圖片 3.下載失敗的圖片
loader.get(url_img, ImageLoader.getImageListener(iv_show, R.mipmap.ic_default, R.mipmap.ic_error));



ImageLoader的get的過載方法一覽:

public ImageContainer get(String requestUrl, final ImageListener listener) {
    return get(requestUrl, listener, 0, 0);
}

public ImageContainer get(String requestUrl, ImageListener imageListener,
            int maxWidth, int maxHeight) {
    return get(requestUrl, imageListener, maxWidth, maxHeight, ScaleType.CENTER_INSIDE);
}

public ImageContainer get(String requestUrl, ImageListener imageListener,
            int maxWidth, int maxHeight, ScaleType scaleType) {

    ~~~
}



ImageLoader.getImageListener原始碼一覽:

/**
     * The default implementation of ImageListener which handles basic functionality
     * of showing a default image until the network response is received, at which point
     * it will switch to either the actual image or the error image.
     * @param view The imageView that the listener is associated with.
     * @param defaultImageResId Default image resource ID to use, or 0 if it doesn't exist.
     * @param errorImageResId Error image resource ID to use, or 0 if it doesn't exist.
     */
    public static ImageListener getImageListener(final ImageView view,
            final int defaultImageResId, final int errorImageResId) {
        return new ImageListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                if (errorImageResId != 0) {
                    view.setImageResource(errorImageResId);
                }
            }

            @Override
            public void onResponse(ImageContainer response, boolean isImmediate) {
                if (response.getBitmap() != null) {
                    view.setImageBitmap(response.getBitmap());
                } else if (defaultImageResId != 0) {
                    view.setImageResource(defaultImageResId);
                }
            }
        };
    }

這個方法返回一個預設的監聽器,來給ImageView設定不同狀態下顯示的圖片。引數defaultImageResId,errorImageResId,可設定0,表示沒有預設的圖片id和載入錯誤的圖片id。

/**
 *快取bitmap的類
 */
public class BitmapCache implements ImageLoader.ImageCache {
    /**
     * LruCache最近最少使用的演算法 :記憶體快取。。。
     * 當記憶體不充足時,會清除最近最少使用的一些圖片。
     */
    private LruCache<String, Bitmap> mCache;

    public BitmapCache() {
        //獲得到當前應用分配的最大記憶體
        // 一般分1/8記憶體給圖片做快取用
        int maxSize = (int) (Runtime.getRuntime().maxMemory() / 8);
        mCache = new LruCache<String, Bitmap>(maxSize) {
            @Override
            protected int sizeOf(String key, Bitmap value) {
                return value.getByteCount(); //返回當前要快取圖片的大小
            }
        };
    }

    @Override
    public Bitmap getBitmap(String url) {
        return mCache.get(url);
    }

    @Override
    public void putBitmap(String url, Bitmap bitmap) {
        if (getBitmap(url) == null){  //如果當前快取中沒有url對應的圖片,我們再存到記憶體快取
            mCache.put(url, bitmap);
        }
    }
}

NetworkImageView帶下載功能的ImageView

NetworkImageView拓展了ImageView實現了下載的功能,(相對於使用普通的ImageView,避免由於控制元件重用帶來的圖片錯位的問題)。使用方法:

  1. 把使用到ImageView的地方替換成NetworkImageView
  2. 初始化ImageLoader
  3. 通過NetWorkImageView物件設定下載圖片的配置資訊(如最大寬高等)
  4. 通過NetWorkImageView物件呼叫setImageUrl方法進行圖片的下載

示例如下:

//事先初始化好的RequestQueue和ImageLoader
RequestQueue requestQueue = Volley.newRequestQueue(this);
ImageLoader imageLoader = new ImageLoader(requestQueue, new BitmapCache());

//NetWorkImageView
netiv.setDefaultImageResId(R.mipmap.ic_default); //設定預設的圖片的id
netiv.setErrorImageResId(R.mipmap.ic_error); //設定下載失敗後的圖片的id
netiv.setImageUrl(url_img, imageLoader); //下載圖片

VolleyUtils

對Volley進行再一次的封裝,方便我們的使用:

package com.alex.week06_02.utils;


import android.content.Context;
import android.graphics.Bitmap;
import android.widget.ImageView;

import com.alex.week06_02.BitmapCache;
import com.android.volley.AuthFailureError;
import com.android.volley.RequestQueue;
import com.android.volley.Response;
import com.android.volley.toolbox.ImageLoader;
import com.android.volley.toolbox.ImageRequest;
import com.android.volley.toolbox.StringRequest;
import com.android.volley.toolbox.Volley;

import java.util.Map;

/**
 * 單例模式對Volley進行簡單封裝
 * @author noonecode
 */
public class VolleyUtils {

    private static VolleyUtils mInstance;
    private RequestQueue mRequestQueue;
    private ImageLoader mImageLoader;
    private ImageLoader.ImageCache mCache;

    private VolleyUtils(Context context) {
        mRequestQueue = Volley.newRequestQueue(context);
        mCache = new BitmapCache();
        mImageLoader = new ImageLoader(mRequestQueue, mCache);
    }
    //單例模式
    public VolleyUtils newInstance(Context context) {
        if (mInstance == null) {
            synchronized (VolleyUtils.class) {
                if (mInstance == null) {
                    mInstance = new VolleyUtils(context);
                }
            }
        }
        return mInstance;
    }

    public RequestQueue getRequestQueue() {
        return mRequestQueue;
    }

    public ImageLoader getImageLoader(){
        return mImageLoader;
    }

    /**
     * 傳送一個字串請求
     * @param method 請求方式GET/POST
     * @param url 請求的連結
     * @param params POST請求時的引數,可為null
     * @param listener 請求返回資料的監聽器
     * @param errorListener 請求發生錯誤的監聽器
     */
    public void sendStringRequest(final int method, String url, final Map<String, String> params, Response.Listener<String> listener,
                                  Response.ErrorListener errorListener){
        StringRequest stringRequest = new StringRequest(method, url, listener, errorListener){
            @Override
            protected Map<String, String> getParams() throws AuthFailureError {
                if (method == Method.POST) {
                    return params;
                }
                return null;
            }
        };
        mRequestQueue.add(stringRequest);
    }

    /**
     * 傳送一個字串請求
     * @param url 圖片的連結
     * @param listener 成功獲取到Bitmap的監聽器
     * @param maxWidth 最大寬度,0則不限制
     * @param maxHeight 最大高度,0則不限制
     * @param scaleType ImageView的拉伸屬性
     * @param decodeConfig 圖片的格式
     * @param errorListener 失敗的監聽器
     */
    public void sendImageRequest(String url, Response.Listener<Bitmap> listener, int maxWidth, int maxHeight,
                                 ImageView.ScaleType scaleType, Bitmap.Config decodeConfig, Response.ErrorListener errorListener){
        ImageRequest imageRequest = new ImageRequest(url, listener, maxWidth, maxHeight, scaleType, decodeConfig, errorListener);
        mRequestQueue.add(imageRequest);
    }
}

使用方法:
1. 首先通過單例的方法獲得出VolleyUtils的物件

private VolleyUtils mVolleyUtils;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    //~~~
    mVolleyUtils = VolleyUtils.newInstance(this);
}

發出一個字串的請求:

mVolleyUtils.sendStringRequest(Request.Method.GET, "https://www.baidu.com", null, new Response.Listener<String>() {
                    @Override
                    public void onResponse(String response) {
                        tvShow.setText(response);
                    }
                }, null);

發出一個圖片請求:

mVolleyUtils.sendImageRequest("https://www.baidu.com/img/bd_logo1.png", new Response.Listener<Bitmap>() {
                    @Override
                    public void onResponse(Bitmap response) {
                        iv_show.setImageBitmap(response);
                    }
                }, 0, 0, ImageView.ScaleType.CENTER, Bitmap.Config.RGB_565, null);



(完畢,如果您(❤ ω ❤)喜歡,請支援點贊)

相關推薦

Android Volley框架

注:文章出自http://blog.csdn.net/guolin_blog/article/details/17482095,有興趣可以先去閱讀。 Volley簡介 對於Android系統網路通訊,我們知道目前用的最普遍的就是HttpClient和HttpURLConnection,但是H

Android Volley框架使用

Volley瞭解 Volley的中文翻譯為“齊射、併發”,是在2013年的Google大會上釋出的一款Android平臺網路通訊庫,具有網路請求的處理、小圖片的非同步載入和快取等功能,能夠幫助 Android APP 更方便地執行網路操作,而且更快速高效。

Android MVC開發框架

div ada 2-2 展示 gpo lose 回調接口 cycle recycler 1、目錄根據需要自行添加   adapter    用於RecyclerView、ListView 等各種適配器  fragment    存放fragment   model    

Android 7.0 IMS框架

本文主要講解IP Multimedia Subsystem (IMS)在Android 7.0上由谷歌Android實現的部分內容。  從APP側一直到Telephony Framework,是不區分CS流程還是PS流程的。到了Telephony Framework模組,

Android Transition Framework --- 超炫的動畫框架

前言 早在Android 4.4,Transition 就已經引入,但在5.0才得以真正的實現。而究竟Transition是用來幹嘛的呢。接下來我將通過例項和原理解析來分析下Google這個強大的動畫框架。 先來張效果圖鎮住場面 Google Play上的New

ijkplayer-android框架

ijkplayer是一個基於ffplay的輕量級Android/iOS視訊播放器,實現了跨平臺的功能,API易於整合;編譯配置可裁剪,方便控制安裝包大小。 本文重點分析其C語言實現的核心程式碼,涉及到不同平臺下的封裝介面或處理方式時,均以Android平臺為例。一、FFpl

Android中鴻洋封裝的OkHttp框架

1下載並依賴jar包 OKhttp官網: 在這裡下載okhttputils-2_6_2.jar 2加許可權 <uses-permission android:name="andro

jQuery Validate驗證框架

lec false 樣式 廈門 adding 常用 invalid util 類名 jQuery校驗官網地址:http://bassistance.de/jquery-plugins/jquery-plugin-validation 一、導入js庫 <scri

(轉) shiro權限框架04-shiro認證

software protected .get 打開 net 文件的 apach stc cdc http://blog.csdn.net/facekbook/article/details/54906635 shiro認證 本文介紹shiro的認證功能 認證流程

(轉)shiro權限框架05-shiro授權

roles ktr ase sub turn stp exc protected user http://blog.csdn.net/facekbook/article/details/54910606 本文介紹 授權流程 授權方式 授權測試 自定義授權rea

(轉)shiro權限框架06-shiro與web項目整合(下)

tex web項目 ssd ndis form認證 lec rfi 出身 javadoc http://blog.csdn.net/facekbook/article/details/54962975 shiro和web項目整合,實現類似真實項目的應用 web項目中

aNDROID之MEDIapLaYER

iap music media 詳解 list oid aid 5% layer %E8%BD%AC%E8%BD%BD%E4%B8%80%E4%B8%AA%E5%9B%BE%E7%89%87%E5%A4%84%E7%90%86%E5%B7%A5%E5%85%B7%E7%B1

Django框架

ews ref mode 分享 png django 剖析 href http      一、WSGI剖析 二、Django-url路由系統 三、Django-views視圖與邏輯處理 四、Django-Models與ORM 五、Django-Template模板

Hadoop學習筆記:MapReduce框架

object 好的 單點故障 提高 apr copy 普通 exce 代表性 開始聊mapreduce,mapreduce是hadoop的計算框架,我學hadoop是從hive開始入手,再到hdfs,當我學習hdfs時候,就感覺到hdfs和mapreduce關系的緊密。這個

Android RxJava操作符系列: 變換操作符

urn 原因 轉換 需要 生產 依賴 reat 入門 所有 Rxjava,由於其基於事件流的鏈式調用、邏輯簡潔 & 使用簡單的特點,深受各大 Android開發者的歡迎。Github截圖 如果還不了解 RxJava,請看文章:Android:這是一篇 清晰 &

jmapper框架(前言)

git 方便 再看 嘗試 寫博客 後繼 測試 如果 個人   第一次寫博客,各種不足之處還望理解。   由於項目需要,項目經理在原來的ssm+duubo+mq框架上加入jmapper框架,本來以為是一個很簡單的ORM框架,幾天就搞定了。誰知道自己太笨,整了近一個月才把業務嵌

Fork/Join框架

ceo font print 捕獲異常 rri 完成 ddl 取數據 sys   Fork/Join框架是Java 7提供的一個用於並行執行任務的框架,是一個把大任務分割成若幹個小任務,最終匯總每個小任務結果後得到大任務結果的框架。Fork/Join框架要完成兩件事情:  

hadoop框架

con 完成 shu ati 默認 logs 應用 sso 分布式存 Hadoop學習隨筆(參考:http://blog.csdn.net/mobanchengshuang/article/details/78786652) Hadoop項目主要包括以下四個模塊 ◆ Had

android:exported 屬性

itl fas 默認 之前 綁定 四大 nbsp ring ins http://blog.csdn.net/watermusicyes/article/details/46460347 昨天在用360掃描應用漏洞時,掃描結果,出來一個android:exported屬性,

Java集合框架

dha put 同時 列表 true 是個 獲取 pac .com 一、集合框架圖 簡化圖: 說明:對於以上的框架圖有如下幾點說明 1.所有集合類都位於java.util包下。Java的集合類主要由兩個接口派生而出:Collection和Map,Collection和M