Android Volley 的使用总结

上个周末去4S店保养, 抽空把Volley学习了一下,
参考的是这篇文章: http://blog.csdn.net/guolin_blog/article/details/17482095
这篇文章对一些关键的知识点进行一下总结:

背景:

Android系统中主要提供了两种方式来进行HTTP通信,HttpURLConnection和HttpClient,不过HttpURLConnection和HttpClient的用法还是稍微有些复杂的,如果不进行适当封装的话,很容易就会写出不少重复代码。于是乎,一些Android网络通信框架也就应运而生. google 2013年推出的Volley可是说是把AsyncHttpClient和Universal-Image-Loader的优点集于了一身,既可以像AsyncHttpClient一样非常简单地进行HTTP通信,也可以像Universal-Image-Loader一样轻松加载网络上的图片。它的设计目标就是非常适合去进行数据量不大,但通信频繁的网络操作, 例如像微博这样的APP.

StringRequest的使用方法:
1. 调用Volley的static方法 newRequestQueue(context),

得到RequestQueue对象, 之后所有的网络请求都添加到这个RequestQueue对象就可以了.

RequestQueue mQueue = Volley.newRequestQueue(context);
2. new一个StringRequest对象, 访问url, 得到服务端返回的字符串.
StringRequest stringRequest = new StringRequest("http://www.baidu.com",
                        new Response.Listener() {
                            @Override
                            public void onResponse(String response) {
                                Log.d("TAG", response);
                            }
                        }, new Response.ErrorListener() {
                            @Override
                            public void onErrorResponse(VolleyError error) {
                                Log.e("TAG", error.getMessage(), error);
                            }
                        });

StringRequest的构造函数需要传入三个参数,第一个参数就是目标服务器的URL地址,第二个参数是服务器响应成功的回调,第三个参数是服务器响应失败的回调。

3. 最后,将这个StringRequest对象添加到RequestQueue里面就可以了.
mQueue.add(stringRequest);
4. 默认是GET请求, 如果要使用POST请求的话, 就需要使用带4个参数的StringRequest()构造方法. 请求参数通过重写父类Request中的getParams()方法来设置.
StringRequest stringRequest = new StringRequest(Method.POST, url,  listener, errorListener) {
    @Override
    protected Map getParams() throws AuthFailureError {
        Map map = new HashMap();
        map.put("params1", "value1");
        map.put("params2", "value2");
        return map;
    }
};
JsonRequest的用法

JsonRequest有两个直接的子类,JsonObjectRequest和JsonArrayRequest,一个是用于请求一段JSON数据的,一个是用于请求一段JSON数组的。
使用方法和StringRequest类似.

JsonObjectRequest jsonObjectRequest = new JsonObjectRequest("http://m.weather.com.cn/data/101010100.html", null,
        new Response.Listener() {
            @Override
            public void onResponse(JSONObject response) {
                Log.d("TAG", response.toString());
            }
        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                Log.e("TAG", error.getMessage(), error);
            }
        });
mQueue.add(jsonObjectRequest); 

之前提过,Volley是将AsyncHttpClient和Universal-Image-Loader的优点集成于一身的一个框架。我们都知道,Universal-Image-Loader具备非常强大的加载网络图片的功能,而使用Volley,我们也可以实现基本类似的效果,并且在性能上也豪不逊色于Universal-Image-Loader,下面我们就来具体学习一下吧。

ImageRequest的用法
ImageRequest imageRequest = new ImageRequest(
        "http://developer.android.com/images/home/aw_dac.png",
        new Response.Listener() {
            @Override
            public void onResponse(Bitmap response) {
                imageView.setImageBitmap(response);
            }
        }, 0, 0, Config.RGB_565, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                imageView.setImageResource(R.drawable.default_image);
            }
        });

第三第四个参数分别用于指定允许图片最大的宽度和高度,如果指定的网络图片的宽度或高度大于这里的最大值,则会对图片进行压缩,指定成0的话就表示不管图片有多大,都不会进行压缩。第五个参数用于指定图片的颜色属性,其中ARGB_8888可以展示最好的颜色属性,每个图片像素占据4个字节的大小,而RGB_565则表示每个图片像素占据2个字节大小。
第六个参数是图片请求失败的回调,这里我们当请求失败时在ImageView中显示一张默认图片。

最后把这个ImageRequest对象添加到RequestQueue对象中去就可以了.

mQueue.add(imageRequest); 
ImageLoader的用法

为了让开发者更方便的加载网络图片, Volley还提供了ImageLoader, 并且它的内部也是使用ImageRequest来实现的,不过ImageLoader明显要比ImageRequest更加高效,因为它不仅可以帮我们对图片进行缓存,还可以过滤掉重复的链接,避免重复发送请求。

分为以下几步:
创建一个ImageLoader对象
ImageLoader imageLoader = new ImageLoader(mQueue, new ImageCache() {
    @Override
    public void putBitmap(String url, Bitmap bitmap) {
    }

    @Override
    public Bitmap getBitmap(String url) {
        return null;
    }
});
//这里并没有让ImageLoader具备缓存功能.

获取一个ImageListener对象
ImageListener listener = ImageLoader.getImageListener(imageView,
        R.drawable.default_image, R.drawable.failed_image);
//第一个参数指定用于显示图片的ImageView控件,
//第二个参数指定加载图片的过程中显示的图片,第三个参数指定加载图片失败的情况下显示的图片。
调用ImageLoader的get()方法加载网络上的图片
imageLoader.get("http://img.my.csdn.net/uploads/201404/13/1397393290_5765.jpeg", listener);
要使用到ImageLoader的缓存功能, 就需要提供一个ImageCache接口的实现类.

这里, 我们在实现的内部通过Android framework提供的LruCache实现缓存.

public class BitmapCache implements ImageCache {

    private LruCache mCache;

    public BitmapCache() {
        int maxSize = 10 * 1024 * 1024; //提供一个10Mb的缓存.
        mCache = new LruCache(maxSize) {
            @Override
            protected int sizeOf(String key, Bitmap bitmap) {
                return bitmap.getRowBytes() * bitmap.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 = new ImageLoader(mQueue, new BitmapCache());
NetworkImageView的用法

除了以上两种方式之外,Volley还提供了第三种方式来加载网络图片,即使用NetworkImageView。不同于以上两种方式,NetworkImageView是一个自定义控件,它是继承自ImageView的,具备ImageView控件的所有功能,只是在原生的基础之上加入了加载网络图片的功能。

在布局文件中使用NetworkImageView控件



    
networkImageView = (NetworkImageView) findViewById(R.id.network_image_view);
networkImageView.setDefaultImageResId(R.drawable.default_image);
networkImageView.setErrorImageResId(R.drawable.failed_image);
networkImageView.setImageUrl("http://img.my.csdn.net/uploads/201404/13/1397393290_5765.jpeg",
                imageLoader);
//这里分别设置加载中显示的图片,加载失败时显示的图片,以及目标图片的URL地址.
//其中,setImageUrl()方法接收两个参数,第一个参数用于指定图片的URL地址,第二个参数则是前面创建好的ImageLoader对象.

NetworkImageView是一个控件,在加载图片的时候它会自动获取自身的宽高,然后对比网络图片的宽度,再决定是否需要对图片进行压缩。也就是说,压缩过程是在内部完全自动化的,并不需要我们关心,NetworkImageView会始终呈现给我们一张大小刚刚好的网络图片,不会多占用任何一点内存,这也是NetworkImageView最简单好用的一点吧。
当然了,如果你不想对图片进行压缩的话,其实也很简单,只需要在布局文件中把NetworkImageView的layout_width和layout_height都设置成wrap_content就可以了,这样NetworkImageView就会将该图片的原始大小展示出来,不会进行任何压缩.

自定义XMLRequest

网络上传输的数据通常有两种格式,JSON和XML,Volley并没有提供支持XML数据的网络请求,但Volley提供了非常强的扩展机制,使得我们可以很轻松地定制出任意类型的Request.
仿照StringRequest写XMLRequest就行, StringRequest一共才70多行的代码, 仿照写也是比较容易的.

=======DONE============

你可能感兴趣的:(Android Volley 的使用总结)