Android Volley的基本用法和简单封装,高效的网络请求框架

版权声明:本文是博主原创文章,不得转载本文任何内容。原文地址: https://blog.csdn.net/smile_Running/article/details/82150014

                         【声明】:未经许可,禁止转载!

· 介绍

volley,它是android的一项热门的开源网络框架,是Gooogle I/O 2013发布的一个处理和缓存网络请求的库。既然我们知道它是用于网络请求的,那总是有它独到的优点。

Volley拥有以下特点:

1、可以对网络请求进行排序

2、网络请求优先级处理

3、缓存

4、多级别取消请求

5、和Activity生命周期联动

6、可以自定义拓展

7、非常适合数据量不大,但是通信频繁的请求

但是它的一个致命缺点:在数据量盘大的请求状态(例如:文件下载),volley表现很糟糕。

· 基本使用

当然,我们重点是会如何去使用它,下面我们通过一些简单的代码,来学习volley的基本用法。

Volley基本使用步骤(掌握这个套路即可):

    一、创建一个请求队列

    二、创建一个请求方式

    三、往队列里添加请求

volley的使用,通常是以上的三个步骤就可以完成一个网络请求操作。例如,发送一个get请求,我们看下代码的实现。(url即是百度首页地址)

· StringRequest方式的GET请求

   · StringRequest(请求返回的是string类型)

    /**
     * 不带参数的 GET 请求方式
     */
    private void volleyGetRequest() {
        RequestQueue requestQueue = Volley.newRequestQueue(this);
        StringRequest stringRequest = new StringRequest(url, new Response.Listener<String>() {
            @Override
            public void onResponse(String s) {
                Log.i("--get请求--", "onResponse: " + s);
            }
        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError e) {
                Log.i("--get请求--", "onResponse: " + e);
            }
        });
        requestQueue.add(stringRequest);
    }

· StringRequest方式的POST请求(携带参数)

    /**
     * 携带参数的POST请求,StringRequest请求方式
     */
    private void volleyPostRequestWithParams() {
        RequestQueue requestQueue = Volley.newRequestQueue(this);
        StringRequest stringRequest = new StringRequest(Request.Method.POST, url, new Response.Listener<String>() {
            @Override
            public void onResponse(String s) {
                Log.i("--post请求--", "onResponse: " + s);
            }
        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError e) {
                Log.i("--post请求--", "onResponse: " + e);
            }
        }) {
            @Override
            protected Map<String, String> getParams() throws AuthFailureError {
                Map<String, String> params = new HashMap<>();
                params.put("param1", "test1");
                params.put("param2", "test2");
                return params;
            }
        };
        requestQueue.add(stringRequest);
    }

· JsonObjectRequest方式的POST请求

   · JsonObjectRequest(请求返回的是JSONObject类型)

    /**
     * 发送 POST 请求
     * JsonObjectRequest 请求方式,返回的是 JSONObject 类型的数据
     */
    private void volleyPostRequest() throws JSONException {
        RequestQueue requestQueue = Volley.newRequestQueue(this);
        JSONObject json = new JSONObject();
        json.put("param1", "test1");
        json.put("param2", "test2");
        JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(Request.Method.POST, url, json,
                new Response.Listener<JSONObject>() {
                    @Override
                    public void onResponse(JSONObject obj) {
                        Log.i("--post请求--", "onResponse: " + obj);
                    }
                },
                new Response.ErrorListener() {
                    @Override
                    public void onErrorResponse(VolleyError e) {
                        Log.i("--post请求--", "onResponse: " + e);
                    }
                });
        requestQueue.add(jsonObjectRequest);
    }

· ImageRequest方式请求图片地址

   · ImageRequest(请求返回的是Bitmap类型)

    String URL = "http://thyrsi.com/t6/364/1535451629x1822611251.jpg";

    /**
     * ImageRequest 请求方式,用于请求图片链接,返回的是 Bitmap 类型的数据
     */
    private void volleyImageRequest() {
        RequestQueue requestQueue = Volley.newRequestQueue(this);
        ImageRequest imageRequest = new ImageRequest(URL,
                new Response.Listener<Bitmap>() {
                    @Override
                    public void onResponse(Bitmap bitmap) {
                        iv_show_image.setImageBitmap(bitmap);
                    }
                }, 0, 0, Bitmap.Config.RGB_565,
                new Response.ErrorListener() {
                    @Override
                    public void onErrorResponse(VolleyError volleyError) {

                    }
                });
        requestQueue.add(imageRequest);
    }

注意:Bitmap.Config里面的参数设置。

· ImageLoader方式请求图片地址(效果图与上图基本一致)

   · 注意也是volley包下的ImageLoader类

    String URL = "http://thyrsi.com/t6/364/1535451629x1822611251.jpg";
    private LruCache<String, Bitmap> mCache = null;

    /**
     * 注意ImageLoader也是volley包下的
     * ImageLoader实现加载图片,添加图片缓存,避免oom
     */
    private void volleyImageRequest() {
        RequestQueue requestQueue = Volley.newRequestQueue(this);
        ImageLoader imageLoader = new ImageLoader(requestQueue, new ImageLoader.ImageCache() {
            @Override
            public Bitmap getBitmap(String s) {
                final int maxSize = 10 * 1024 * 1024;//10M大小的缓存
                mCache = new LruCache<String, Bitmap>(maxSize) {
                    @Override
                    protected int sizeOf(String key, Bitmap bitmap) {
                        return bitmap.getRowBytes() * bitmap.getHeight();
                    }
                };
                return mCache.get(s);
            }

            @Override
            public void putBitmap(String s, Bitmap bitmap) {
                mCache.put(s, bitmap);
            }
        });
        /**
         * params 1 : 目标imageview控件
         * params 2 : 默认显示的image
         * params 3 : 加载失败时显示的image
         */
        ImageLoader.ImageListener imageListener = ImageLoader.
                getImageListener(iv_show_image, R.mipmap.ic_launcher, R.mipmap.ic_launcher_round);
        imageLoader.get(URL, imageListener);
    }

· 最后一种以控件的使用方式(与系统控件使用一致,这里就不做太多说明)

    <com.android.volley.toolbox.NetworkImageView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

· Volley对以上几种请求的封装类

    以单例模式创建网络请求操作,以同一个消息队列管理请求消息。

/**
 * volley 请求方式封装类
 *
 * @Created by xww.
 * @Creation time 2018/8/28.
 */

public final class SimpleRequest {
    private static final RequestQueue mRequestQueue = Volley.newRequestQueue(App.getContext());
    private LruCache<String, Bitmap> mCache = null;

    private static final class Holder {
        private static final SimpleRequest INSTANCE = new SimpleRequest();
    }

    static SimpleRequest getInstance() {
        return Holder.INSTANCE;
    }

    public final void sendStringRequest(String url, Response.Listener<String> success, Response.ErrorListener error) {
        StringRequest stringRequest = new StringRequest(url, success, error);
        mRequestQueue.add(stringRequest);
    }

    public final void sendStringRequest(int method, String url, Response.Listener<String> success,
                                        Response.ErrorListener error, final Map<String, String> params) {
        StringRequest stringRequest = new StringRequest(method, url, success, error) {
            @Override
            protected Map<String, String> getParams() throws AuthFailureError {
                return params;
            }
        };
        mRequestQueue.add(stringRequest);
    }

    public final void sendJSONRequest(int method, String url, JSONObject jsonObject,
                                      Response.Listener<JSONObject> success, Response.ErrorListener error) {
        JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(method, url, jsonObject, success, error);
        mRequestQueue.add(jsonObjectRequest);
    }

    /**
     * @param decodeConfig 位图的属性配置
     */
    public final void sendImageRequest(String url, int maxWidth, int maxHeight, Bitmap.Config decodeConfig,
                                       Response.Listener<Bitmap> success, Response.ErrorListener error) {
        ImageRequest imageRequest = new ImageRequest(url, success, maxWidth, maxHeight, decodeConfig, error);
        mRequestQueue.add(imageRequest);
    }

    /**
     * 默认的ImageRequest,最大宽、高不进行设定
     * Bitmap默认为占用最小配置
     */
    public final void sendImageRequest(String url, Response.Listener<Bitmap> success, Response.ErrorListener error) {
        ImageRequest imageRequest = new ImageRequest(url, success, 0, 0, Bitmap.Config.RGB_565, error);
        mRequestQueue.add(imageRequest);
    }

    /**
     * 拥有缓存机制的加载Image方式
     *
     * @param target     目标ImageView
     * @param defalutRes 默认显示图片
     * @param errorRes   失败时显示图片
     */
    public final void sendImageLoader(String url, ImageView target, int defalutRes, int errorRes) {
        ImageLoader imageLoader = new ImageLoader(mRequestQueue, new ImageLoader.ImageCache() {
            @Override
            public Bitmap getBitmap(String s) {
                final int maxSize = 10 * 1024 * 1024;//10M大小的缓存
                mCache = new LruCache<String, Bitmap>(maxSize) {
                    @Override
                    protected int sizeOf(String key, Bitmap bitmap) {
                        return bitmap.getRowBytes() * bitmap.getHeight();
                    }
                };
                return mCache.get(s);
            }

            @Override
            public void putBitmap(String s, Bitmap bitmap) {
                mCache.put(s, bitmap);
            }
        });
        ImageLoader.ImageListener imageListener = ImageLoader.
                getImageListener(target, defalutRes, errorRes);
        imageLoader.get(url, imageListener);
    }
}

封装类的使用方式:

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.btn_request_get:
                SimpleRequest
                        .getInstance()
                        .sendStringRequest(url, new Response.Listener<String>() {
                            @Override
                            public void onResponse(String s) {
                                Log.i("--get请求--", "onResponse: " + s);
                            }
                        }, new Response.ErrorListener() {
                            @Override
                            public void onErrorResponse(VolleyError volleyError) {

                            }
                        });
                break;
            case R.id.btn_request_post:
                JSONObject jsonObject = new JSONObject();
                SimpleRequest.getInstance()
                        .sendJSONRequest(Request.Method.POST, url, jsonObject, new Response.Listener<JSONObject>() {
                            @Override
                            public void onResponse(JSONObject jsonObject) {

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

                            }
                        });
                break;
            case R.id.btn_image_request:
                SimpleRequest.getInstance()
                        .sendImageLoader(URL, iv_show_image, R.mipmap.ic_launcher, R.mipmap.ic_launcher_round);
                break;
        }
    }

Volley的基本使用就简单的介绍完了,因为Volley本身已经很简洁、易用了,所以我们继续的封装几种通用和常用的请求方式,让网络请求框架使用起来更加的方便。

©原文链接:https://blog.csdn.net/smile_Running/article/details/82150014

猜你喜欢

转载自blog.csdn.net/smile_Running/article/details/82150014