码迷,mamicode.com
首页 > 其他好文 > 详细

从源码角度 解决Volley框架乱码的问题

时间:2015-05-14 14:10:12      阅读:128      评论:0      收藏:0      [点我收藏+]

标签:源码   乱码   volley   

用Volley框架,解析json 发现了乱码问题。但是服务器的有不愿
意改,只能看源码改了。

Volley框架有三个方法
StringRequest;
JsonArrayRequest
JsonObjectRequest
发下他们分别都是继承了JsonRequest 类
然后呢我们又发现 JsonRequest 类 前面有abstract 是抽象的
惯性思想就是 三个集成一个抽象类 那么三个肯定有类似的方法

结果发现了唯一的抽象类是这个
parseNetworkResponse(NetworkResponse response);

那么就在JsonObjectRequest中找到parseNetworkResponse

  @Override
    protected Response<JSONObject> parseNetworkResponse(NetworkResponse response) {
        try {
             String jsonString =
                     new String(response.data,       HttpHeaderParser.parseCharset(response.headers));
            return Response.success(new JSONObject(jsonString),
                    HttpHeaderParser.parseCacheHeaders(response));
        } catch (UnsupportedEncodingException e) {
            return Response.error(new ParseError(e));
        } catch (JSONException je) {
            return Response.error(new ParseError(je));
        }
    }

然后再在点 HttpHeaderParser.parseCharset(response.headers));

    /**
     * Returns the charset specified in the Content-Type of this header,
     * or the HTTP default (ISO-8859-1) if none can be found.
     */
    public static String parseCharset(Map<String, String> headers) {
        String contentType = headers.get(HTTP.CONTENT_TYPE);
        if (contentType != null) {
            String[] params = contentType.split(";");
            for (int i = 1; i < params.length; i++) {
                String[] pair = params[i].trim().split("=");
                if (pair.length == 2) {
                    if (pair[0].equals("charset")) {
                        return pair[1];
                    }
                }
            }
        }
        return HTTP.DEFAULT_CONTENT_CHARSET;
    }

重点来了。the HTTP default (ISO-8859-1) if none can be found. 如果接受的头信息么有确定 格式,那么就用 ISO-8859-1
有点儿坑爹。

解决乱码方法
1. 把 return HTTP.DEFAULT_CONTENT_CHARSET; 改为return HTTP.UTF_8;
2. 推荐的方法。重写parseNetworkResponse方法。
改为如下代码即可


    @Override
    protected Response<JSONObject> parseNetworkResponse(NetworkResponse response) {
        try {
//          格式定义为utf-8
            String jsonString =
                new String(response.data, "utf-8");
//            如果头信息中定义了 编码格式,那么久用编码格式
            response.headers.put(HTTP.CONTENT_TYPE,
                    response.headers.get("content-type"));
            return Response.success(new JSONObject(jsonString),
                    HttpHeaderParser.parseCacheHeaders(response));
        } catch (UnsupportedEncodingException e) {
            return Response.error(new ParseError(e));
        } catch (JSONException je) {
            return Response.error(new ParseError(je));
        }
    }

搞定了。

从源码角度 解决Volley框架乱码的问题

标签:源码   乱码   volley   

原文地址:http://blog.csdn.net/wanghao200906/article/details/45719995

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!