文档章节

实现一个定制的请求

WolfCS
 WolfCS
发布于 2014/08/05 16:11
字数 792
阅读 36
收藏 0

这一节描述了如何为那些Volley支持的out-of-the-box类型之外的类型,实现你自己的定制的请求类型。

编写一个定制的请求

在toolbox中,具有大多数请求的可用的实现;如果你的响应是一个字符串,图片或JSON,你可能不需要实现一个定制的请求。

对于那些你确实需要实现一个定制的请求的情况,下面是你需要做的全部:

  • 扩展Request<T>类,其中<T>表示请求想要的解析之后的响应的类型。因而如果你的解析之后的响应是一个字符串,比如,则通过扩展Request<String>来创建你自己的定制请求。扩展Request<T>的例子可以参考Volley toolbox类StringRequest和ImageRequest
  • 实现抽象方法parseNetworkResponse()和deliverResponse(),后面会进一步描述。

parseNetworkResponse

一个Response为一个给定类型(比如字符串,图片,或JSON)的delivery封装了一个解析后的response。这里是一个parseNetworkResponse()的示例实现:

@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));
    }
    // handle errors
...
}

注意下列内容:

  • parseNetworkResponse()拿到一个NetworkResponse作为它的参数,其中包含有一个byte[]形式的响应payload,HTTP状态码,和response headers。
  • 你的实现必须返回一个Response<T>,其中包含有你的输入的response对象和缓存的metadata或一个error,比如在解析失败的情况。

如果你的协议具有非-标准的缓存语义,你可以自己构建一个 Cache.Entry,但大多数请求用下面的这样的东西就行了:

return Response.success(myDecodedObject,
        HttpHeaderParser.parseCacheHeaders(response));

Volley在一个worker线程中调用parseNetworkResponse()。这将确保昂贵的解析操作,比如把一幅JPEG解码为一个Bitmap,不会阻塞UI线程。

deliverResponse

Volley在主线程中以你在parseNetworkResponse()中返回的对象回调你。大多数请求调用一个这里的回调接口,比如:

protected void deliverResponse(T response) {
        listener.onResponse(response);

示例:GsonRequest

Gson是一个使用反射把Java对象与JSON互转的库。你可以定义Java对象,它们具有与他们对应的JSON keys相同的名字,传递Gson类对象,Gson将为你填充那些成员。这里是一个使用GSON来解析的完整的Volley请求的实现:

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
    protected void deliverResponse(T response) {
        listener.onResponse(response);
    }

    @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));
        }
    }
}

如果你喜欢的话,Volley提供了可用的JsonArrayRequest和JsonArrayObject类。请参考使用标准的请求类型一节来获取更多信息。

译自:http://developer.android.com/training/volley/request-custom.html

Done.

© 著作权归作者所有

WolfCS
粉丝 81
博文 147
码字总数 505184
作品 4
杭州
高级程序员
私信 提问
依赖注入[2]: 基于IoC的设计模式

正如我们在《控制反转》提到过的,很多人将IoC理解为一种“面向对象的设计模式”,实际上IoC自身不仅与面向对象没有必然的联系,它也算不上是一种设计模式。一般来讲,设计模式提供了一种解决...

Artech
2018/07/26
0
0
浅谈SpringMVC之DispatcherServlet

Spring的MVC框架是围绕一个DispatcherServlet其实就是个Servlet(它继承自HttpServlet基类)来设计的, 它支持可配置的处理器映射、视图渲染、本地化、时区与主题渲染、文件上传等 控制器一般...

恋码之子
01/22
43
0
从零开始仿写一个抖音App——app架构更新与网络层定制

本文首发于简书——何时夕,搬运转载请注明出处,否则将追究版权责任。交流qq群:859640274 本项目的 github 地址:MyTikTok 国庆快结束了,国庆中有六天都在写文章看代码还有比我苦逼的吗(...

何时夕
2018/10/07
0
0
.NET Core的依赖注入[1]: 控制反转

写在前面:我之前写过一系列关于.NET Core依赖注入的文章,由于.NET Core依赖注入框架的实现原理发生了很大的改变,加上我对包括IoC和DI这些理论层面的东西又有了一些新的理解,所以我在此基...

Artech
2018/07/25
0
0
C++语言的HTTP开发包--avhttp

avhttp avhttp是一个基于Boost.Asio实现的HTTP客户端开发工具库. 简介 它支持HTTP(1.0/1.1)、HTTPS, 断点续传, 多线程并发下载, 异步, HTTP/SOCKS4/SOCKS5代理支持等特性, 开发者可以轻松的基...

Jackarain
2013/02/25
6.6K
0

没有更多内容

加载失败,请刷新页面

加载更多

只需一步,在Spring Boot中统一Restful API返回值格式与统一处理异常

统一返回值 在前后端分离大行其道的今天,有一个统一的返回值格式不仅能使我们的接口看起来更漂亮,而且还可以使前端可以统一处理很多东西,避免很多问题的产生。 比较通用的返回值格式如下:...

晓月寒丶
今天
58
0
区块链应用到供应链上的好处和实际案例

区块链可以解决供应链中的很多问题,例如记录以及追踪产品。那么使用区块链应用到各产品供应链上到底有什么好处?猎头悬赏平台解优人才网小编给大家做个简单的分享: 使用区块链的最突出的优...

猎头悬赏平台
今天
27
0
全世界到底有多少软件开发人员?

埃文斯数据公司(Evans Data Corporation) 2019 最新的统计数据(原文)显示,2018 年全球共有 2300 万软件开发人员,预计到 2019 年底这个数字将达到 2640万,到 2023 年达到 2770万。 而来自...

红薯
今天
61
0
Go 语言基础—— 通道(channel)

通过通信来共享内存(Java是通过共享内存来通信的) 定义 func service() string {time.Sleep(time.Millisecond * 50)return "Done"}func AsyncService() chan string {retCh := mak......

刘一草
今天
57
0
Apache Flink 零基础入门(一):基础概念解析

Apache Flink 的定义、架构及原理 Apache Flink 是一个分布式大数据处理引擎,可对有限数据流和无限数据流进行有状态或无状态的计算,能够部署在各种集群环境,对各种规模大小的数据进行快速...

Vincent-Duan
今天
50
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部