• Volley使用指南第四回(来自developer.android)


    Volley网络请求的第四篇,废话不多说,开始。

    这一篇文章将会教你怎样在Volley支持的范围内定制一个请求。

    第一步:写一个通用请求:

    大多数请求都有已经写好的接口供你调用,如果你的请求是String、image、JSON之类,那么你就不需要定制请求类型,反之你可能要自己实现。

    定制请求的实现步骤:

    1、继承Request<T>类,其中T代表你的请求希望的返回类型,如果你期望的返回类型是String,那么你可以这样定制:Request<String>,正式因为如此

    Volley中的StringRequest和ImageRequest就是继承的Request<T>。

    2、完成parseNetworkResponse()和deliverResponse()方法,栗子如下:

    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作为参数,NetworkResponse包括了字节流,返回状态,返回头。这个函数的实现必须包含一个Response<T>类型的

    返回,里面包括你定制的返回对象、缓存元数据或者是一个错误,比如说解析错误。

    如果你有一个非标准的缓存要求,你可以自己创建一个Cache.Entity,但大多数情况是这样的:

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

    Volley在工作线程里面调用解析的方法,以免在解析繁杂的数据时候阻塞主线程,比如说把jepg格式的图片解码成Bitmap类型。

    例子:GsonRequest

    Gson可以把java类型和Json类型相互转换,你可以定义一个java类型,这个类型的字段和与之对应的json键友相同的名字,把这个对象传给Gson,gson就会为你填充json字段

    ,下面使用gson解析的例子:

     1 public class GsonRequest<T> extends Request<T> {
     2     private final Gson gson = new Gson();
     3     private final Class<T> clazz;
     4     private final Map<String, String> headers;
     5     private final Listener<T> listener;
     6 
     7     /**
     8      * Make a GET request and return a parsed object from JSON.
     9      *
    10      * @param url URL of the request to make
    11      * @param clazz Relevant class object, for Gson's reflection
    12      * @param headers Map of request headers
    13      */
    14     public GsonRequest(String url, Class<T> clazz, Map<String, String> headers,
    15             Listener<T> listener, ErrorListener errorListener) {
    16         super(Method.GET, url, errorListener);
    17         this.clazz = clazz;
    18         this.headers = headers;
    19         this.listener = listener;
    20     }
    21 
    22     @Override
    23     public Map<String, String> getHeaders() throws AuthFailureError {
    24         return headers != null ? headers : super.getHeaders();
    25     }
    26 
    27     @Override
    28     protected void deliverResponse(T response) {
    29         listener.onResponse(response);
    30     }
    31 
    32     @Override
    33     protected Response<T> parseNetworkResponse(NetworkResponse response) {
    34         try {
    35             String json = new String(
    36                     response.data,
    37                     HttpHeaderParser.parseCharset(response.headers));
    38             return Response.success(
    39                     gson.fromJson(json, clazz),
    40                     HttpHeaderParser.parseCacheHeaders(response));
    41         } catch (UnsupportedEncodingException e) {
    42             return Response.error(new ParseError(e));
    43         } catch (JsonSyntaxException e) {
    44             return Response.error(new ParseError(e));
    45         }
    46     }
    47 }
  • 相关阅读:
    miniui表格设置百分比不生效
    sql delete删除不存在的记录 提示成功,如何判断sql执行成功
    共享程序集和强命名程序集(下)
    共享程序集和强命名程序集(上)
    生成、打包、部署和管理应用程序及类型(下)
    生成、打包、部署和管理应用程序及类型(上)
    clr的执行模型(下)
    clr的执行模型(中)
    使用时间戳解决缓存问题
    sql修改字段类型为clob
  • 原文地址:https://www.cnblogs.com/lout/p/4893071.html
Copyright © 2020-2023  润新知