Android Volley 详解 Google发布的一套用于网络通信的工具库

下载地址:git clone https://android.googlesource.com/platform/frameworks/volley 

或 : https://github.com/mcxiaoke/android-volley


Volley 能作什么

Google 2013 I/O 大会上发布的一个网络通信库。处理一些网络方面的请求,如数据解析、下载显示图片。

· 数据处理对网络请求获取的数据的处理。

· 图片加载:对网络图片的下载及显示。


使用步骤

使用权限

 <uses-permissionandroid:name="android.permission.INTERNET"/>

 <uses-permissionandroid:name="android.permission.WRITE_EXTERNAL_STORAGE"/>


初始化请求队列

RequestQueue mRequestQueue =  Volley.newRequestQueue(Context context);


网络请求数据处理

默认提供两种数据请求类型,一为StringRequest,一为JsonRequest

JsonRequest又分:

· JsonArrayRequest

JsonArrayRequest request = new JsonArrayRequest("url", 
				new Response.Listener<JSONArray>() {

					@Override
					public void onResponse(JSONArray response) {//请求响应返回的JSONArray
						
					}
				}, 
				new Response.ErrorListener() {

					@Override
					public void onErrorResponse(VolleyError error) {
						
					}
				});
		mRequestQueue.add(request);

· JsonObjectRequest

JsonObjectRequest request = new JsonObjectRequest(Method.GET, WEATHER_JSON_ADDRESS, null, 
				new Response.Listener<JSONObject>() {

					@Override
					public void onResponse(JSONObject response) {//请求响应返回的JSONObject
						System.out.println(response);
					}
				},
				new Response.ErrorListener() {

					@Override
					public void onErrorResponse(VolleyError error) {
						System.out.println("test4JsonObjectRequest - error");
					}
				});
		
		mRequestQueue.add(request);
    mRequestQueue.add(request);  将请求加入队列。 可以有很多个add 入队操作,然后start
    mRequestQueue.start();             启动请求
    mRequestQueue.stop();             停止请求


图片加载请求

· ImageRequest 加载图片

  使用方式与上面的JsonRequest类似

private void requestByImageRequest(final ImageView imageView, String url) {
		ImageRequest imgRequest = new ImageRequest(url, 
				new Response.Listener<Bitmap>() {
					@Override
					public void onResponse(Bitmap bitmap) {//下载成功后
						imageView.setImageBitmap(bitmap);
					}
				}, 
				imageView.getWidth(), imageView.getHeight(), Config.RGB_565, 
				new ErrorListener(){
					@Override
					public void onErrorResponse(VolleyError error) { //下载出错
						
					}
				});
		mRequestQueue.add(imgRequest);
		mRequestQueue.start();
	}

· ImageLoader 加载图片

private void requestByImageLoader(ImageView imageView, String url) {
		int maxMemory = (int) Runtime.getRuntime().maxMemory();//app最大内存 字节数
		int mCacheSize = maxMemory / 8;  //以1/8 用作缓存
		final LruCache<String, Bitmap> mLruImageCache = new LruCache<String, Bitmap>(mCacheSize) {
			@Override
			protected int sizeOf(String key, Bitmap value) {//计算一张图片的内存size
				if (android.os.Build.VERSION.SDK_INT >= 12) {
					return value.getByteCount(); //需要api >=12 , 总字节数
				} else {
					return value.getRowBytes() * value.getHeight(); //每行字节乘以高(即行)   api1
				}
			}
		};
		ImageCache imageCache = new ImageCache() {
			@Override
			public void putBitmap(String key, Bitmap value) {
				mLruImageCache.put(key, value);
			}

			@Override
			public Bitmap getBitmap(String key) {
				return mLruImageCache.get(key);
			}
		};
		ImageLoader mImageLoader = new ImageLoader(mRequestQueue, imageCache);
		// 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); //get方法已经开始执行了加载url-bitmap
		
//		ImageContainer imageContainer = mImageLoader.get(url, listener); //get方法已经开始执行了加载url-bitmap
//		Bitmap bitmap = imageContainer.getBitmap();
//		String requestUrl = imageContainer.getRequestUrl();
	}

ImageLoader 需要结合 ImageCache来进行构造。ImageCache是一个interface

ImageCache 的put/get Bitmap的方法 ,推荐使用LruCache来实现。

ImageListener 是一个interface,提供两个方法:onResponse(),onResponseError()

ImageLoader 图片加载流程:ImageLoader.get(url, listener),判断是否存在于cache中,如果有,则直接取出并在listener中显示;如果没有,则new 一个ImageRequest,加入到requestQueue中,将listener中相应的方法在ImageRequest中的Response.Listener中进行调用。


· NetworkImageView 加载图片

private void requestByNetworkImg(NetworkImageView imageView, String url) {
		final LruCache<String, Bitmap> mImageCache = new LruCache<String, Bitmap>(8*1024*1024) {
			@Override
			protected int sizeOf(String key, Bitmap value) {//计算一张图片的内存size
				return value.getRowBytes() * value.getHeight(); //每行字节乘以高(即行)   api1
			}
		};
		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);
		/*
		 * seturl时,里面的实现是:有了ImageLoader,就能执行加载url-bitmap的操作
		 */
		imageView.setDefaultImageResId(0); //默认图
		imageView.setErrorImageResId(0); //错误图
		imageView.setImageUrl(url, mImageLoader); 
	}

这是一个继承自ImageView的自定义组件。

imageView.setDefaultImageResId(0); //默认图
imageView.setErrorImageResId(0); //错误图
imageView.setImageUrl(url, mImageLoader); 

结合了ImageLoader,内部调用ImageLoader.get()来实现图片的加载。

在ListView中的item使用NetworkImageView:

    只需要new 一个ImageLoader对象。不同的item,set不同的URL即可。

    因为在ImageLoader中会new不同的ImageRequest加到RequestQueue中执行下载。


自定义Request

/**
 * Volley adapter for JSON requests that will be parsed into Java objects by Gson.
 */
public class GsonObjectRequest<T> extends Request<T> {
    protected final Gson gson = new Gson();
    protected final Class<T> clazz;
    protected final Map<String, String> headers;
    protected final Listener<T> listener;

    /**
     * Make a GET request and return a parsed object from JSON.
     *
     * @param url URL of the request to make
     * @param clazz Relevant class object, for Gson's reflection
     * @param headers Map of request headers
     */
    public GsonObjectRequest(int method, String url, Class<T> clazz, Map<String, String> headers,
            Listener<T> listener, ErrorListener errorListener) {
        super(method, url, errorListener);
        this.clazz = clazz;
        this.headers = headers;
        this.listener = listener;
    }
    
    public GsonObjectRequest(String url, Class<T> clazz, Map<String, String> headers,
    		Listener<T> listener, ErrorListener errorListener) {
    	this(Method.GET, url, clazz, headers, listener, errorListener);
    }

    @Override
    public Map<String, String> getHeaders() throws AuthFailureError {
        return headers != null ? headers : super.getHeaders();
    }

    @Override
    protected void deliverResponse(T response) {
        listener.onResponse(response);
    }
    
    //将请求获取的json转成 用gson 转成了对应的对象
    @Override 
    protected Response<T> parseNetworkResponse(NetworkResponse response) {
        try {
            String json = new String(
                    response.data, HttpHeaderParser.parseCharset(response.headers));
            return Response.success(
                    gson.fromJson(json, clazz), HttpHeaderParser.parseCacheHeaders(response));
        } catch (UnsupportedEncodingException e) {
            return Response.error(new ParseError(e));
        } catch (JsonSyntaxException e) {
            return Response.error(new ParseError(e));
        }
    }
}
自定义Request,至少需要重写 parseNetworkResponse() 、deliverResponse()

其他说明

Volley 类中定义了磁盘缓存目录。

Request  .cancel() ,可以取消一个请求。

Request  .setTag(String tag),设置一个tag

RequestQueue .cancelAll(String tag),取消同一tag标识的Request

RequestQueue .cancelAll(new RequestFilter() {}); 以RequestFilter来过滤 需要取消的Request


示例http://download.csdn.net/detail/jjwwmlp456/8176595


  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Volley是一个优秀的安卓开源网络访问工具,这里包含了volley jar包和源码,版本是2015.07.28的1.0.18版本。更多资料可以参见volley的github地址: https://github.com/mcxiaoke/android-volley 1.0.18 2015.07.28 merge upstream, process response bodies only when present tweak getCacheKey(), using method and original url, fix #67 #78 add RedirectError, wrong exception for http 301 and 302, fix #51 make NetworkResponse Serializable, fix #53 create NetworkError using IOException, not using null response 1.0.17 2015.07.13 merge upstream, stop logging slow requests outside of debug logs merge pr #64, fix leaking the last request object 1.0.16 2015.05.18 fix duplicate retry, change DEFAULT_MAX_RETRIES to 0 merge pr, fix NegativeArraySizeException merge upstream, Use a BufferedOutputStream to read and write cache 1.0.15 2015.03.18 add two missing constructors for JsonArrayRequest and JsonObjectRequest add unique identifier for Request 1.0.14 2015.03.17 add more constructors for JsonArrayRequest and JsonObjectRequest update and fix gradle build, using new build.gradle 1.0.13 2015.03.16 merge pr, added constructor to JSONArrayRequest 1.0.12 2015.03.12 merge upstream, fix ImageLoader.getCacheKey() merge upstream, Fix broken DiskBasedCache merge upstream, Modify header parser to handle must-revalidate. 1.0.11 2015.03.03 merge upstream, Add a RequestFinishedListener to RequestQueue. merge upstream, Change the default character encoding for JSON responses to UTF-8 1.0.10 2014.12.30 merge upstream, Use the view size and scale type to restrict NIV requests. merge pr, Add a getImageURL method to NetworkImageView merge pr, Add the options of setting DiskBasedCache sizes in Volley.java 1.0.9 2014.11.26 merge upstream, Fix deprecation warnings (now errors in 0.14.4) w/ gradle. 1.0.8 2014.11.07 merge upstream, Metric for network time and getBackoffMultiplier() 1.0.7 2014.10.13 merge upstream, Add locale to HttpHeaderParserTest.rfc1123Date(long millis) merge upstream, Copy cache header for 304 response 1.0.6 2014.09.10 merge pr, fixed bug where Disk cache misses for redirects merge upstream, Fix crash/OOM in DiskBasedCache merge upstream, allow use of custom ImageRequests in ImageLoader 1.0.5 2014.06.18 merge upstream, Fixes bug in PATCH method. Sets the method before setting the body. update gradle and build tools version, fix build 1.0.4 2014.05.04 merge upstream, Guard against NullPointerException currently occurring in Volley when a Request is given a url whose host is null. 1.0.3 2014.04.01 merge upstream, ImageLoader: setError after null check 1.0.2 2014.02.28 merge upstream, Use the view size to restrict NIV requests. merge upstream, Fix generic type parameter for RequestQueue.add(Request) merge pr, added support for handling 301 and 302 http redirects using standalone deploy gradle build file and script 1.0.1 2014.02.13 add gradle build support, add readme, release using gradle 1.0.0 2014.01.03 create volley mirror at github, release first version

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值