Volley(一)

来源:互联网 发布:linux 安装ttf 编辑:程序博客网 时间:2024/06/05 16:55

首先,我使用的是AndroidStudio,用的依赖是:compile 'com.android.volley:volley:1.0.0'

Eclipse开发可以到GitHub上下载,然后导入。https://github.com/google/volley

Volley是集请求,图片,文件下载于一身的框架,在面对数据量小,请求次数多时发挥功能强大,而面对大文件下载等大数据传输时则力不从心。

Volley请求网络都是基于请求队列的,我们只需要将请求放在队列中,则会在队列以此处理,因此在大量网络请求,队列发挥着重要作用。

Volley:

RequestQueue 用来执行请求的请求队列

Request 用来构造请求对象

Request:

StringRequest 响应的主体为字符串

JsonArrayRequest 发送和请求Json数组

JsonObjectRequest 发送和接收Json对象

ImageRequest 发送和接收Image图片


使用:

首先我们需要创建一个ResuestQueue,然后再创建自己需要的请求并通过 add 来将其添加进请求队列中。requestQueue = Volley.newRequestQueue(context);


然后需要创建自己的请求对象,这里的例子是使用StringRequest类,得到的是String类型的网络数据,并将该请求对象添加至请求队列中,等待相应:

StringRequest s = new StringRequest(Request.Method.POST, url, new Response.Listener<String>() {            @Override            public void onResponse(String response) {            }        }, new Response.ErrorListener() {            @Override            public void onErrorResponse(VolleyError error) {            }        }) {            @Override            protected Map<String, String> getParams() throws AuthFailureError {                return super.getParams();            }        };

这里我们使用Post请求方式来进行访问url,之后再StringRequest类中又重写了getParams方法是为了添加请求参数。


还有现在最常用的JSON格式:

JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(Request.Method.POST, url, new JSONObject(), new Response.Listener<JSONObject>() {            @Override            public void onResponse(JSONObject response) {            }        }, new Response.ErrorListener() {            @Override            public void onErrorResponse(VolleyError error) {            }        });        requestQueue.add(jsonObjectRequest);

在此,我们是访问网络数据。

在Volley中还嵌入ImageLoader框架,用于网络图片处理,方法和上面很像,也是在列队中添加一个Request请求对象,之后列队会为我们处理该请求。

使用ImageRequest来完成这一请求编码

ImageRequest imageRequest = new ImageRequest(url, new Response.Listener<Bitmap>() {            @Override            public void onResponse(Bitmap response) {            }        }, 100, 100, Bitmap.Config.RGB_565, new Response.ErrorListener() {            @Override            public void onErrorResponse(VolleyError error) {            }        });        requestQueue.add(imageRequest);


使用ImageLoader:

在Volley中的ImageLoader内部也是使用ImageRequest来实现的,但是ImageLoader比其更加高效,因为他不仅可以帮我们队图片进行缓存,还可以过滤重复的链接,避免出现重复请求。该现象在ListView、GridView上更加明显。

方法和之前有所不同,首先需要创建Queue队列(第一步一样)。

第二,创建ImageLoader对象,其中就需要将队列对象传进去:

ImageLoader imageLoader = new ImageLoader(requestQueue, new ImageLoader.ImageCache() {            @Override            public Bitmap getBitmap(String url) {                return null;            }            @Override            public void putBitmap(String url, Bitmap bitmap) {            }        });

第三步,就是调用 ImageLoader的getImageListener 方法,第一个参数是放置的控件,第二个是加载时的图片,第三个图片是加载失败时显示的图片。

ImageLoader.ImageListener imageListener = imageLoader.getImageListener(imageView, R.drawable.ic_launcher, R.drawable.ic_launcher);

在最后,调用ImageLoad的 get 方法放置我们的url和配置好的imageListener。当然他也有设置图片大小的重载方法。

imageLoader.get(url, imageListener);
以上是对ImageLoader的基本用法,而高级用法都在 cache 中。在此推荐使用LruCache功能进行缓存。


class BitmapCache implements ImageLoader.ImageCache {        public LruCache<String, Bitmap> lruCache;        public BitmapCache() {            lruCache = new LruCache<String, Bitmap>(8 * 1024 * 1024) {                @Override                protected int sizeOf(String key, Bitmap value) {                    return value.getRowBytes() * value.getHeight();                }            };        }        @Override        public Bitmap getBitmap(String url) {            return lruCache.get(url);        }        @Override        public void putBitmap(String url, Bitmap bitmap) {            lruCache.put(url, bitmap);        }    }
这里实现了ImageCache接口,并在其中使用LruCahce集合来做缓存。

NetworkImageView

在最后,Volley还提供了第三种方式加载网络图片。NetworkImageView控件。

1.创建RequestQueue列队

2.创建ImageLoader对象

3.在布局中添加该控件

4.在代码中找到该控件并设置要加载的图片地址

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);  

当然,我们可以继承Request类来自己定义自己的请求方式,确认得到制定的返回格式。







0 0