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

来源:互联网 发布:错生网络剧娟姐 编辑:程序博客网 时间:2024/05/19 17:52

下载地址: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>() {@Overridepublic void onResponse(JSONArray response) {//请求响应返回的JSONArray}}, new Response.ErrorListener() {@Overridepublic void onErrorResponse(VolleyError error) {}});mRequestQueue.add(request);

· JsonObjectRequest

JsonObjectRequest request = new JsonObjectRequest(Method.GET, WEATHER_JSON_ADDRESS, null, new Response.Listener<JSONObject>() {@Overridepublic void onResponse(JSONObject response) {//请求响应返回的JSONObjectSystem.out.println(response);}},new Response.ErrorListener() {@Overridepublic 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>() {@Overridepublic void onResponse(Bitmap bitmap) {//下载成功后imageView.setImageBitmap(bitmap);}}, imageView.getWidth(), imageView.getHeight(), Config.RGB_565, new ErrorListener(){@Overridepublic 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) {@Overrideprotected int sizeOf(String key, Bitmap value) {//计算一张图片的内存sizeif (android.os.Build.VERSION.SDK_INT >= 12) {return value.getByteCount(); //需要api >=12 , 总字节数} else {return value.getRowBytes() * value.getHeight(); //每行字节乘以高(即行)   api1}}};ImageCache imageCache = new ImageCache() {@Overridepublic void putBitmap(String key, Bitmap value) {mLruImageCache.put(key, value);}@Overridepublic Bitmap getBitmap(String key) {return mLruImageCache.get(key);}};ImageLoader mImageLoader = new ImageLoader(mRequestQueue, imageCache);// ImageLoader.getImageListener的第二个参数是默认的图片resource id,请求的图片为空时设置// 第三个参数是请求失败时候的资源id,可以指定为0ImageListener 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) {@Overrideprotected int sizeOf(String key, Bitmap value) {//计算一张图片的内存sizereturn value.getRowBytes() * value.getHeight(); //每行字节乘以高(即行)   api1}};ImageCache imageCache = new ImageCache() {@Overridepublic void putBitmap(String key, Bitmap value) {mImageCache.put(key, value);}@Overridepublic 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 0
原创粉丝点击