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

时间: 2024-08-14 23:44:18

Android Volley Google发布的一套用于网络通信的工具库的相关文章

Android Volley 具体解释 Google公布的一套用于网络通信的工具库

下载地址:git clone https://android.googlesource.com/platform/frameworks/volley 或 : https://github.com/mcxiaoke/android-volley Volley 能作什么 Google 2013 I/O 大会上公布的一个网络通信库. 处理一些网络方面的请求,如数据解析.下载显示图片. · 数据处理:对网络请求获取的数据的处理. · 图片载入:对网络图片的下载及显示. 使用步骤 使用权限 <uses-p

Android Volley网络通讯框架(Google)

Volley主页 https://android.googlesource.com/platform/frameworks/volley http://www.youtube.com/watch?v=yhv8l9F44qo&feature=player_embedded 1. 什么是Volley 在这之前,我们在程序中需要和网络通信的时候,大体使用的东西莫过于AsyncTaskLoader,HttpURLConnection,AsyncTask,HTTPClient(Apache)等,今年的Go

Google 发布 Android 性能优化典范

2015年伊始,Google发布了关于Android性能优化典范的专题, 一共16个短视频,每个3-5分钟,帮助开发者创建更快更优秀的Android App.课程专题不仅仅介绍了Android系统中有关性能问题的底层工作原理,同时也介绍了如何通过工具来找出性能问题以及提升性能的建议.主要从三个 方面展开,Android的渲染机制,内存与GC,电量优化.下面是对这些问题和建议的总结梳理. 0)Render Performance 大多数用户感知到的卡顿等性能问题的最主要根源都是因为渲染性能.从设计

Google发布官方集成开发环境Android Studio 1.0

Google发布官方集成开发环境Android Studio 1.0    http://www.36kr.com/p/217653.html Android Studio系列教程一--下载与安装  http://stormzhang.com/devtools/2014/11/25/android-studio-tutorial1/ http://android-studio.org/

Android使用Google推荐的联网框架Volley,让连接网络更加简单

大家好,随着技术的进步,科技的发达,很少有应用是单机的了,大部分都需要联网访问服务器,以前我们都用 httpclient和httpurlconnection,感觉是不是非常麻烦,而Google特别为开发者考虑,推出了Volley,从此妈妈再也不担心我的联网问题了,哪里联不上联哪里,Volley让联网更容易和更快,并且Volley请求会异步执行,不阻挡主线程联网请求无非就是Get或者Post,我们很少用到DELETE这个请求方式,说了这么多废话,下面让我们看看Volley到底能干啥.它真的有这么神

Android Market google play store帐号注册方法流程 及发布应用注意事项【转载】

[转载]http://www.cnblogs.com/zdz8207/archive/2012/07/09/google-play-store-registered.html Android Market google play store帐号注册方法流程 及发布应用注意事项 Android Market google play store帐号申请 注册方法流程 在 Google Play 中发布软件之前,您需要完成以下三项工作: 创建开发人员个人资料 接受开发人员分发协议 通过信用卡支付注册费

Google 发布的15个 Android 性能优化典范

2015年伊始,Google发布了关于Android性能优化典范的专题,一共16个短视频,每个3-5分钟,帮助开发者创建更快更优秀的Android App.课程专题不仅仅介绍了Android系统中有关性能问题的底层工作原理,同时也介绍了如何通过工具来找出性能问题以及提升性能的建议.主要从三个方面展开,Android的渲染机制,内存与GC,电量优化.下面是对这些问题和建议的总结梳理. 0)Render Performance 大多数用户感知到的卡顿等性能问题的最主要根源都是因为渲染性能.从设计师的

【转帖】Google发布了安卓开发环境Android Studio 1.0

我们开发安卓大多是使用Eclipse和安卓SDK中自带的安卓模拟器.当然,Google早就推出了自己的安卓开发环境——Android studio,在不久前,Google发布了Android Studio 1.0,个人感觉使用起来还是不错的.之前下载过一些Android studio的早期版本,但是都因为"网络问题"而安装失败,无奈删除.而这一次,Android studio 1.0下载后,不需要再联网下载东西了,直接解压就可以使用.  一.Android Studio 1.0.1的下

Android Volley 库的使用

本文内容 什么是 Volley 库 Volley 能做什么 Volley 架构 演示 Volley 库的使用 参考资料 Android 关于网络操作一般都会介绍 HttpClient 以及 HttpConnection 这两个包.前者是 Apache 开源库,后者是 Android 自带 API.企业级应用,一般都会选择使用已经封装好的 http 框架.比较流行有 Volley.android-async-http.retrofit.okhttp.androidquery.AndroidAsyn