zoukankan      html  css  js  c++  java
  • 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


  • 相关阅读:
    POJ 1149 PIGS(Dinic最大流)
    HDU 4514 湫湫系列故事——设计风景线(并查集+树形DP)
    [kuangbin带你飞]专题十一 网络流个人题解(L题留坑)
    BZOJ 3931 网络吞吐量(最短路+拆点最大流)
    学习RMQ-ST表
    `这个符号在mysql中的作用
    用一条mysql语句插入多条数据
    Leetcode 257 Binary Tree Paths 二叉树 DFS
    Leetcode 203 Remove Linked List Elements 链表
    Leetcode 38 Count and Say 传说中的递推
  • 原文地址:https://www.cnblogs.com/mthoutai/p/7043920.html
Copyright © 2011-2022 走看看