您的位置:首页 > 理论基础 > 计算机网络

网络通信框架Volley使用详细说明

2014-10-15 19:40 351 查看
这一篇详细的介绍一下Volley的使用。Volley主要获取JSON对象和图片加载,这里分为两部分介绍。

1、获取JSON对象

1.1声明RequestQueue

声明一个新的RequestQueue对象

[java] view
plaincopyprint?

private RequestQueue mRequestQueue;

在onCreate初始化mRequestQueue

[java] view
plaincopyprint?

mRequestQueue = Volley.newRequestQueue(this);

1.2 声明并使用Request

[java] view
plaincopyprint?

JsonObjectRequest jr = new JsonObjectRequest(Request.Method.GET,url,null,new Response.Listener<JSONObject>() {

@Override

public void onResponse(JSONObject response) {

Log.i(TAG,response.toString());

parseJSON(response);

va.notifyDataSetChanged();

pd.dismiss();

}

},new Response.ErrorListener() {

@Override

public void onErrorResponse(VolleyError error) {

Log.i(TAG,error.getMessage());

}

});

mRequestQueue.add(jr);

Volley提供了JsonObjectRequest、JsonArrayRequest、StringRequest等Request形式。

JsonObjectRequest:返回JSON对象。

JsonArrayRequest:返回JsonArray。

StringRequest:返回String,这样可以自己处理数据,更加灵活。

另外可以继承Request<T>自定义Request。

1.3 取消Request

Activity里面启动了网络请求,而在这个网络请求还没返回结果的时候,Activity被结束了,此时如果继续使用其中的Context等,除了无辜的浪费CPU,电池,网络等资源,有可能还会导致程序crash,所以,我们需要处理这种一场情况。使用Volley的话,我们可以在Activity停止的时候,同时取消所有或部分未完成的网络请求。Volley里所有的请求结果会返回给主进程,如果在主进程里取消了某些请求,则这些请求将不会被返回给主线程。Volley支持多种request取消方式。

1)可以针对某些个request做取消操作:

[java] view
plaincopyprint?

@Override

public void onStop() {

for (Request <?> req : mRequestQueue) {

req.cancel();

}

}

2)取消这个队列里的所有请求:

[java] view
plaincopyprint?

@Override

protected void onStop() {

// TODO Auto-generated method stub

super.onStop();

mRequestQueue.cancelAll(this);

}

3)可以根据RequestFilter或者Tag来终止某些请求

[java] view
plaincopyprint?

@Override

rotected void onStop() {

// TODO Auto-generated method stub

super.onStop();

mRequestQueue.cancelAll( new RequestFilter() {});

or

mRequestQueue.cancelAll(new Object());

Volley支持http的GET、POST、PUT、DELETE等方法,上面给出了GET方法,其他方法请参考

2、图片加载

2.1使用ImageRequest下载图片

Volley提供了多种Request方法,ImageRequest能够处理单张图片,返回bitmap。下面是ImageRequest的使用例子,和JsonRequest的一样。

[java] view
plaincopyprint?

singleImg=(ImageView)findViewById(R.id.volley_img_single_imgeview);

ImageRequest imgRequest=new ImageRequest(url, new Response.Listener<Bitmap>() {

@Override

public void onResponse(Bitmap arg0) {

// TODO Auto-generated method stub

singleImg.setImageBitmap(arg0);

}

}, 300, 200, Config.ARGB_8888, new ErrorListener(){

@Override

public void onErrorResponse(VolleyError arg0) {

// TODO Auto-generated method stub

}

});

mRequestQueue.add(imgRequest);

2.2使用ImageLoader

ImageLoader这个类需要一个Request的实例以及一个ImageCache的实例。图片通过一个URL和一个ImageListener实例的get()方法就可以被加载。从哪里,ImageLoader会检查ImageCache,而且如果缓存里没有图片就会从网络上获取。

Volley的ImageCache接口允许你使用你喜欢的L1缓存实现。不幸的是Volley没有提供默认的实现。在I/O的介绍中展示了BitmapLruCache的一点代码片段,但是Volley这个库本身并不包含任何相关的实现。

ImageCache接口有两个方法,getBitmap(String url)和putBitmap(String
url, Bitmap bitmap).这两个方法足够简单直白,他们可以添加任何的缓存实现。

[java] view
plaincopyprint?

RequestQueue mRequestQueue = Volley.newRequestQueue(this);

final LruCache<String, Bitmap> mImageCache = new LruCache<String, Bitmap>(

20);

ImageCache imageCache = new ImageCache() {

@Override

public void putBitmap(String key, Bitmap value) {

mImageCache.put(key, value);

}

@Override

public Bitmap getBitmap(String key) {

return mImageCache.get(key);

}

};

ImageLoader mImageLoader = new ImageLoader(mRequestQueue, imageCache);

// imageView是一个ImageView实例

// ImageLoader.getImageListener的第二个参数是默认的图片resource id

// 第三个参数是请求失败时候的资源id,可以指定为0

ImageListener listener = ImageLoader

.getImageListener(imageView, android.R.drawable.ic_menu_rotate,

android.R.drawable.ic_delete);

mImageLoader.get(url, listener);

2.3 使用NetworkImageView

[java] view
plaincopyprint?

public class NetworkImageView extends ImageView

继承自ImageView,添加了一个

[java] view
plaincopyprint?

public void setImageUrl(String url, ImageLoader imageLoader) {}

方法,参数包含一个Url地址和一个ImageLoader对象

核心方法:

[java] view
plaincopyprint?

private void loadImageIfNecessary(final boolean isInLayoutPass) {}

内部实现,boolean 类型参数代表是否重新请求网络 ,true:重新请求 false:取缓存

内部实现和ImageLoader类似,都是通过ImageContainer中new一个ImageListener,在ImageListener,只是做了Url的空判断,如果Url为null,则调用ImageContainer.cancelRequest();取消请求。

覆写方法:

[java] view
plaincopyprint?

@Override

protected void onLayout(boolean changed, int left, int top, int right, int bottom) {

super.onLayout(changed, left, top, right, bottom);

//onLayout时重新请求

loadImageIfNecessary(true);

}

@Override

protected void onDetachedFromWindow() {

//销毁View的时候Release操作

if (mImageContainer != null) {

// If the view was bound to an image request, cancel it and clear

// out the image from the view.

mImageContainer.cancelRequest();

setImageBitmap(null);

// also clear out the container so we can reload the image if necessary.

mImageContainer = null;

}

super.onDetachedFromWindow();

}

//drawable状态改变重绘

@Override

protected void drawableStateChanged() {

super.drawableStateChanged();

invalidate();

}

总结:网络请求下载图片显示,可以使用此控件,比传统的ImageView多了网络处理,也添加了2个方法,设置开始下载的默认图和下载出错后显示图。

[java] view
plaincopyprint?

/**

* Sets the default image resource ID to be used for this view until the attempt to load it

* completes.

*/

public void setDefaultImageResId(int defaultImage) {

mDefaultImageId = defaultImage;

}

/**

* Sets the error image resource ID to be used for this view in the event that the image

* requested fails to load.

*/

public void setErrorImageResId(int errorImage) {

mErrorImageId = errorImage;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: