Volley(一)

首先,我使用的是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类来自己定义自己的请求方式,确认得到制定的返回格式。







猜你喜欢

转载自blog.csdn.net/github_34437042/article/details/61196480