Volley 笔记

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 cache
Cache 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 queue
mRequestQueue.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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值