Android網路請求(4) 網路請求框架Volley

2022-11-23 18:00:51

Android網路請求(4) 網路請求框架Volley

Volley是Google在2013年5月15日到17日在舊金山Moscone中心舉辦網路開發者年會中推出的Android非同步網路載入框架和圖片載入框架,它特別適合資料體量小且通訊頻繁的網路操作場景,而Android開發中大多數場景都是這樣的,但是如果讓它去進行檔案上傳下載之類的巨量資料量網路操作,那麼他的表現將非常差。

那麼讓我們走進Volley,來熟悉一下它最基本的使用吧。值得一提的是,Volley提供了一個圖片載入框架NetworkImageView,我們也來一起了解一下吧。

匯入依賴

Volley的歷史不短,但是它的修改卻很少,現在最高的版本也才1.2.1。我們使用的是1.1.1版本,現在build.gradle(app)中的dependencies中匯入依賴

implementation group: 'com.android.volley', name: 'volley', version: '1.1.1'

網路請求

Get請求

//      請求地址
        String src = "https://www.baidu.com";
//      建立請求佇列
        RequestQueue requestQueue = Volley.newRequestQueue(MainActivity.this);
//      建立請求
        StringRequest request = new StringRequest(src, new com.android.volley.Response.Listener<String>() {
            @Override
            public void onResponse(String response) {//成功時返回的response資料
                String s = response.toString();
                System.out.println(s);
            }
        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {//失敗時返回的error資訊
                String message = error.getMessage();
                System.out.println(message);
            }
        });
//      將請求新增至佇列中,否則不會發起請求
        requestQueue.add(request);

直接在MainActivity中進行網路請求,這與我們之前的方式不太一樣,這是因為Volley請求程式碼比OkHtpp還要簡短,監聽都可以new+空格+回車 自動彈出,我們只需要管理返回的資料即可,而且建立的請求佇列並不只能使用一次,這是一個佇列,可以加入多個請求,所以,我們只需要建立請求並且匯入到這個佇列中即可。

Post請求

post請求比get請求多一些引數,首先就是在建立請求時要去指定請求為post,因為預設請求時get,其次需要重寫一個方法用於傳遞post請求所攜帶的引數,如果不這麼做的話,就會報錯。

//      請求地址
        String src = "https://xxx.xxx.com";
//      建立請求佇列
        RequestQueue requestQueue = Volley.newRequestQueue(MainActivity.this);
//      建立請求,新增請求型別
        StringRequest request = new StringRequest(Request.Method.POST   ,src, new com.android.volley.Response.Listener<String>() {
            @Override
            public void onResponse(String response) {//成功時返回的response資料
                String s = response.toString();
                System.out.println(s);
            }
        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {//失敗時返回的error資訊
                String message = error.getMessage();
                System.out.println(message);
            }
        }){
//            post請求一定要傳入引數否則報錯
            @Override
            protected Map<String, String> getParams() throws AuthFailureError {
                Map<String, String> map = new HashMap<>();
                map.put("username","123456");
                map.put("password","123456");
                return map;
            }
        };
//      將請求新增至佇列中,否則不會發起請求
        requestQueue.add(request);

Put請求

Put請求就不說了,只需要修改請求方法即可

Delete請求

delete請求如果需要攜帶引數,可以在post請求的基礎上修改請求方法,如果不攜帶引數可以在get請求的基礎上新增請求方法。

Json資料請求

我們注意到了,我們返回的都是String型別的值,我們日常開發中返回的值大多數時json格式的,那麼我們怎麼樣去請求json資料呢。Volley提供了JsonObjectRequest和JsonArrayRequest這兩個類可用於返回json資料。它的使用方法和StringRequest是一樣的,只需要修改一些引數即可。另外他不在需要通過重寫方法來傳遞引數,可以直接將你需要的引數轉換成json格式,在範例化JsonObjectRequest時傳入

Get請求

//      請求地址
        String src = "https://www.baidu.com";
//      建立請求佇列
        RequestQueue requestQueue = Volley.newRequestQueue(MainActivity.this);
//      建立請求,新增請求型別
        JsonObjectRequest request = new JsonObjectRequest(Request.Method.GET,src,null, new com.android.volley.Response.Listener<JSONObject>() {
            @Override
            public void onResponse(JSONObject response) {//成功時返回的response資料
                String s = response.toString();
                System.out.println(s);
            }
        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {//失敗時返回的error資訊
                String message = error.getMessage();
                System.out.println(message);
            }
        });
//      將請求新增至佇列中,否則不會發起請求
        requestQueue.add(request);

Post

//      請求地址
        String src = "https://www.baidu.com";
//      建立請求佇列
        RequestQueue requestQueue = Volley.newRequestQueue(MainActivity.this);
//      建立引數
        JSONObject data = new JSONObject();
        try {
            data.put("username","123");
            data.put("password","123");
        } catch (JSONException e) {
            e.printStackTrace();
        }
//      建立請求,新增請求型別

//      順序是 請求方法 請求地址 請求攜帶的資料 監聽器
        JsonObjectRequest request = new JsonObjectRequest(Request.Method.POST,src,data, new com.android.volley.Response.Listener<JSONObject>() {
            @Override
            public void onResponse(JSONObject response) {//成功時返回的response資料
                String s = response.toString();
                System.out.println(s);
            }
        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {//失敗時返回的error資訊
                String message = error.getMessage();
                System.out.println(message);
            }
        });
//      將請求新增至佇列中,否則不會發起請求
        requestQueue.add(request);

Put

在post基礎上修改請求方法即可

delete

判斷是否攜帶引數並且post或get中修改即可

網路圖片載入框架

1、通過ImageRequest請求網路圖片

這種方法是通過ImageRequest來請求一張圖片轉換為Bitmap格式,在返回的Bitmap中對ImageView進行設定圖片,較為簡單。

        img = (ImageView) findViewById(R.id.img);
//        建立連結
        String url = "圖片連結";
//      建立佇列
        RequestQueue requestQueue = Volley.newRequestQueue(this);
//        建立圖片請求
        ImageRequest imageRequest = new ImageRequest(url, new Response.Listener<Bitmap>() {
            @Override
            public void onResponse(Bitmap response) {
                img.setImageBitmap(response);
            }
        }, 0, 0, Bitmap.Config.RGB_565, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {

            }
        });
//        新增進佇列
        requestQueue.add(imageRequest);

2、通過Imageloader載入圖片

這種方法對比起上一種來說要更加複雜一些,我們需要先新建一個類實現ImageLoader.ImageCache介面

public class BitmapCache implements ImageLoader.ImageCache{
        private LruCache<String, Bitmap> mCache;

        public BitmapCache() {
            //設定圖片最大值
            int maxSize = 10*1024;
            mCache = new LruCache<String, Bitmap>(maxSize){
                @Override
                protected int sizeOf(String key, Bitmap value) {
                    return value.getRowBytes()*value.getHeight();
                }
            };
        }

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

        @Override
        public void putBitmap(String url, Bitmap bitmap) {
            mCache.put(url,bitmap);
        }
    }

然後再去MainActivity中去建立ImageLoader,它不需要我們去設定圖片,只需要將圖片作為一個引數傳遞進去,它會幫我們自動載入進ImageView中。

        img = (ImageView) findViewById(R.id.img);
//        建立連結
        String url = "圖片連結";
//      建立佇列
        RequestQueue requestQueue = Volley.newRequestQueue(this);
//        建立圖片請求
        ImageLoader imageLoader = new ImageLoader(requestQueue, new BitmapCache());
//        設定圖片載入監聽,設定預設圖片和載入錯誤圖片
        ImageLoader.ImageListener imageListener = imageLoader.getImageListener(img,R.drawable.edittext_bg,R.drawable.ic_home_black_24dp);
//        發起請求
        imageLoader.get(url,imageListener);

3、通過NetworkImageView載入圖片

除了使用ImageView載入圖片,Volley還提供了一個元件就是NetworkImageView,我們在佈局檔案上使用它。

   <com.android.volley.toolbox.NetworkImageView
        android:id="@+id/img"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
    </com.android.volley.toolbox.NetworkImageView>

它同樣需要前面的BitmapCache類,因為他也需要ImageLoder。

        img = (NetworkImageView) findViewById(R.id.img);
//        建立連結
        String url = "圖片地址";
//      建立佇列
        RequestQueue requestQueue = Volley.newRequestQueue(this);
//      建立一個ImageLoader
        ImageLoader imageLoader = new ImageLoader(requestQueue, new BitmapCache());

        // 預設圖片和異常圖片設定
        img.setDefaultImageResId(R.drawable.ic_home_black_24dp);
        img.setErrorImageResId(R.drawable.ic_home_black_24dp);
//        載入圖片
        img.setImageUrl(url,imageLoader);

總結

不管你使用的是Volley框架是單純的請求資料還是載入圖片都要記住,它不適合體量較大的網路請求。

以上三種載入網路圖片的方式最終都能得到成果圖