Volley 笔记

来源:互联网 发布:java web 七牛云接口 编辑:程序博客网 时间:2024/04/30 08:31

Volley概述

Volley是Google 2013年I/O大会推出的H针对Android的HTTP网络请求框架,让网络请求更简单,更快!

  • 特点

    1. 自动调度网络请求
    2. 支持并发网络连接
    3. 支持标准的HTTP缓存协议
    4. 支持请求优先级设置(4级)
    5. 支持取消单个或多个请求
    6. 易于定制,扩展性强。比如Retry&Backoff机制
    7. 强大的网络请求能力让你轻松的发送异步请求来填充UI数据
    8. 提供调试和跟踪工具
  • 优点

擅长将RPC(远程过程调用协议,C/S模式)类型的操作,用来展示服务器数据。比如以某种数据格式获取一页搜索结果。支持任意的数据传输格式,比如图片,字符串,json,你也可以定义自己的数据格式。其实就是自定义Request。Volley呢,让你不再写这些重复的模板代码(网络请求逻辑,不再重复造轮子),这样你就可以专注于你应用本身的业务逻辑.

- 缺点

由于Volley都是在内存中解析和处理数据,所以不适合大数据量的下载操作。如果需要下载大文件,可以考虑使用系统的DownloadManager或者自定义HttpStack。

RequestQueue 请求队列

通过Volley.newRequestQueue获取默认配置的消息队列。

创建请求:new StringRequest(...).setTag(TAG);添加请求:queue.add(stringRequest);取消请求: mRequestQueue.cancelAll(TAG);

配置RequestQueue

// Instantiate the cacheCache cache = new DiskBasedCache(getCacheDir(), 1024 * 1024); // 1MB cap// Set up the network to use HttpURLConnection as the HTTP client.Network network = new BasicNetwork(new HurlStack());// Instantiate the RequestQueue with the cache and network.mRequestQueue = new RequestQueue(cache, network);// Start the queuemRequestQueue.start();

RequestQueue启动后,会开启一个CacheDispatcher和默认4个NetworkDispatcher。

DiskBasedCache用来给CacheDispatcher存取http缓存response,

BasicNetwork用来给NetworkDispatcher发起Request

BasicNetwork初始化的时候需要设置HTTP 客户端。volley中默认提供HttpUrlconnection(api>=9)和HttpClient两种选择

自带Request

StringRequest,ImageRequest,JsonRequest(JsonObjectRequest,JsonArrayRequest)

ImageRequest

发送图片请求,包含图片输入流的解析操作。

ImageLoader:图片加载帮助类,针对批量请求相同URL的ImageRequest做了合并处理,并增加了缓存的处理,对外暴露缓存接口,可自定义缓存方式。

NetworkImageView:ImageView的子类,通过外部提供的ImageLoader,扩展了加载网络图片的功能

自定义Request

继承Request类,实现deliverResponse和parseNetworkResponse两个抽象方法

    public class GsonRequest<T> extends Request<T> {        private final Gson gson = new Gson();        private final Class<T> clazz;        private final Map<String, String> headers;        private 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 GsonRequest(String url, Class<T> clazz, Map<String, String> headers,                Listener<T> listener, ErrorListener errorListener) {            super(Method.GET, url, errorListener);            this.clazz = clazz;            this.headers = headers;            this.listener = listener;        }        @Override        public Map<String, String> getHeaders() throws AuthFailureError {            return headers != null ? headers : super.getHeaders();        }        @Override//处理解析出的response        protected void deliverResponse(T response) {            listener.onResponse(response);        }        @Override//实现原始NetworkResponse的解析工作        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));            }        }    }
0 0
原创粉丝点击