Volley的基本使用

一,Volley所在地址

VolleyGithub地址为https://github.com/mcxiaoke/android-volley

二,Volley的导入
compile 'com.mcxiaoke.volley:library:1.0.19'
三,Volley的基本使用

它的使用一般分为三步:

1,创建RequestQueue对象,建立网络请求队列
2,生成XXXRequest对象(XXX代表Stringjsonimage等),定义网络请求的详细情况
3,将生成的XXXRequest对象加入创建的RequestQueue对象中,开始网络请求

下面来看看具体的使用

3.1,StringRequest的使用

用于GET请求时,代码为:

        private String URL_GET = "https://api.thinkpage.cn/v3/weather/now.json?key=rot2enzrehaztkdk&location=guangzhou&language=zh-Hans&unit=c";

        RequestQueue rq = Volley.newRequestQueue(this);//步骤一:建立请求队列
        StringRequest sr = new StringRequest(URL_GET,//步骤二:生成StringRequest对象
                new Response.Listener() {
                    @Override
                    public void onResponse(String response) {
                        Log.e("LHC", String.format("%s:%s", "volley_get_success:", response));
                    }
                },
                new Response.ErrorListener() {
                    @Override
                    public void onErrorResponse(VolleyError error) {
                        Log.e("LHC", String.format("%s:%s", "volley_get_error:", error.getMessage()));
                    }
                });
        rq.add(sr);//步骤三:将生成的StringRequest对象加入请求队列中并执行网络请求

这样就完成了一次StringRequestGET请求
用于POST请求时,代码为:

        private String URL_BASE = "http://api.k780.com:88/?app=phone.get";

        RequestQueue rq = Volley.newRequestQueue(this);
        StringRequest sr = new StringRequest(Request.Method.POST, URL_BASE, new Response.Listener() {
            @Override
            public void onResponse(String response) {
                Log.e("LHC", String.format("%s:%s", "volley_post_success:", response));
            }
        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                Log.e("LHC", String.format("%s:%s", "volley_post_error:", error.getMessage()));
            }
        }) {
            @Override
            protected Map getParams() throws AuthFailureError {
                Map params = new HashMap<>();
                params.put("phone", "13800138000");
                params.put("appkey", "10003");
                params.put("sign", "b59bc3ef6191eb9f747dd4e83c99f2a4");
                params.put("format", "json");
                params.put("idcard", "110101199001011114");
                return params;
            }
        };
        rq.add(sr);
    }

需要注意的是,在进行POST请求时,我们需要传入请求参数;这里我们就需要调用getParams()来实现参数的传入了。这个方法是重写父类Request的方法。

3.2,JsonObjectRequest的使用

用于GET请求,代码为:

        private String URL_GET = "https://api.thinkpage.cn/v3/weather/now.json?key=rot2enzrehaztkdk&location=guangzhou&language=zh-Hans&unit=c";

        RequestQueue rq = Volley.newRequestQueue(this);
        JsonObjectRequest sr = new JsonObjectRequest(URL_GET,
                new Response.Listener() {
                    @Override
                    public void onResponse(JSONObject response) {
                        Log.e("LHC", String.format("%s:%s", "get_volley_json_success:", response.toString()));
                    }
                },
                new Response.ErrorListener() {
                    @Override
                    public void onErrorResponse(VolleyError error) {
                        Log.e("LHC", String.format("%s:%s", "get_volley_json_error:", error.getMessage()));
                    }
                });
        rq.add(sr);

用于POST请求,代码为:

        private String URL_BASE = "http://api.k780.com:88/?app=phone.get";

        RequestQueue rq = Volley.newRequestQueue(this);
        JsonObjectRequest sr = new JsonObjectRequest(Request.Method.POST, URL_BASE, new Response.Listener() {
            @Override
            public void onResponse(JSONObject response) {
                Log.e("LHC", String.format("%s:%s", "volley_post_json_success:", response.toString()));
            }
        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                Log.e("LHC", String.format("%s:%s", "volley_post_json_error:", error.getMessage()));
            }
        }) {
            @Override
            protected Map getParams() throws AuthFailureError {
                Map params = new HashMap<>();
                params.put("phone", "13800138000");
                params.put("appkey", "10003");
                params.put("sign", "b59bc3ef6191eb9f747dd4e83c99f2a4");
                params.put("format", "json");
                params.put("idcard", "110101199001011114");
                return params;
            }
        };
        rq.add(sr);

这样就完成了JsonObjectRequestGETPOST的网络请求。

3.3,加载图片--ImageRequest的使用

从名字就可以知道这个是用于图片请求的,具体看代码:

        private String URL_IMAGE = "http://c.hiphotos.baidu.com/zhidao/wh%3D450%2C600/sign=5547913f8426cffc697fb7b68c3166a6/241f95cad1c8a7862b15ada86109c93d70cf505d.jpg";

        RequestQueue rq = Volley.newRequestQueue(this);

        ImageRequest ir = new ImageRequest(URL_IMAGE, new Response.Listener() {
            @Override
            public void onResponse(Bitmap response) {
                if (response != null) {
                    ivShow.setImageBitmap(response);
                }
            }
        }, 0, 0, ImageView.ScaleType.CENTER_CROP, Bitmap.Config.ARGB_8888, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                Log.e("LHC", "post_volley_image->error:" + error.toString());
            }
        });

        rq.add(ir);

通过上面的代码,就可以将网络图片获取并加载出来;来具体看看这个请求中的参数:

public ImageRequest(String url,//网络图片的网址
                    Response.Listener listener, //图片获取成功回调
                    int maxWidth, //自定义图片宽
                    int maxHeight, //自定义图片高
                    ScaleType scaleType,  //图片变换类型
                    Config decodeConfig,  //图片解析配置
                    Response.ErrorListener errorListener) //图片获取失败回调

scaleType的值,系统提供的有这么几种:CENTER_CROP,MATRIX,FIT_XY,FIT_START,FIT_CENTER,FIT_END,CENTER,CENTER_INSIDE
decodeConfig的值,系统提供的有这么几种:
ALPHA_8, RGB_565, ARGB_4444, ARGB_8888, RGBA_F16, HARDWARE
注意:如果加载的图片过大,容易造成OOM

3.4,加载图片--ImageLoader的使用

ImageLoader加载图片的步骤和ImageRequest的不同,大致分为四步:
1,创建RequestQueue对象
2,创建ImageLoader对象
3,创建ImageLoader.ImageListener对象
4,使用ImageLoader对象调用get(String requestUrl, final ImageListener listener)方法来加载网络图片
下面我们来看具体代码:

        private String URL_IMAGE = "http://c.hiphotos.baidu.com/zhidao/wh%3D450%2C600/sign=5547913f8426cffc697fb7b68c3166a6/241f95cad1c8a7862b15ada86109c93d70cf505d.jpg";
        RequestQueue rq = Volley.newRequestQueue(this);
        ImageLoader il = new ImageLoader(rq, new ImageLoader.ImageCache() {//这里直接使用系统提供的ImageCache来实现,也可以自定义一个图片缓存
            @Override
            public Bitmap getBitmap(String url) {
                return null;
            }

            @Override
            public void putBitmap(String url, Bitmap bitmap) {
            }
        });
        ImageLoader.ImageListener listener = ImageLoader.getImageListener(
                ivShow, //显示图片的控件
                R.mipmap.ic_launcher, //默认加载中的图片
                R.mipmap.ic_launcher);//加载失败时的图片
        il.get(URL_IMAGE, listener);

这样就完成了图片的加载。但是我们来看看这行代码:

 ImageLoader il = new ImageLoader(rq, new ImageLoader.ImageCache() {//这里直接使用系统提供的ImageCache来实现,也可以自定义一个图片缓存
            @Override
            public Bitmap getBitmap(String url) {
                return null;
            }

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

在生成ImageLoader对象时,传入了两个参数,一个是RequestQueue对象,另一个是ImageCache对象,这个是用来设置图片缓存的,但是系统提供的ImageLoader.ImageCache中并没有进行缓存的处理,是一个空实现。所以我们如果需要实现图片缓存的话,我们可以定义一个。看下面代码:

class BitmapCache implements ImageLoader.ImageCache {
    private LruCache mCache;

    BitmapCache() {
        int maxCacheSize = 10 * 1024 * 1024;
        mCache = new LruCache(maxCacheSize){
            @Override
            protected int sizeOf(String key, Bitmap value) {
                Log.e("LHC", "SIZE:"+value.getRowBytes()*value.getHeight());
                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);
    }
}

这样我们就建立好了自己的图片缓存了,那么生成ImageLoader对象的代码就变成了:

ImageLoader il = new ImageLoader(rq, new BitmapCache());

这样我们就实现了ImageLoader图片缓存的功能了。ImageLoader的内部也是使用ImageRequest来实现的,不过ImageLoader明显要比ImageRequest更加高效,因为它不仅可以帮我们对图片进行缓存,还可以过滤掉重复的链接,避免重复发送请求。

3.5,加载图片--NetworkImageView

NetworkImageView和上面的加载图片的方式都不同,它是一种自定义控件,继承自ImageView,具有ImageView的所有功能,还添加了能够加载网络图片的功能。我们来看它的使用:
XML中加入:


在代码中使用:

        RequestQueue rq = Volley.newRequestQueue(this);
        ImageLoader il = new ImageLoader(rq, new BitmapCache());

        nivShow.setDefaultImageResId(R.mipmap.ic_launcher);//设置加载中显示的图片
        nivShow.setErrorImageResId(R.mipmap.ic_launcher);//设置加载失败显示的图片
        nivShow.setImageUrl(URL_IMAGE_01, il);//加载图片并显示

这样我们也就完成了网络图片的加载。到此volley的基本用法就讲完了。

下一篇:Volley源码浅析

你可能感兴趣的:(Volley的基本使用)