从源码角度 解决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));
        }
    }

搞定了。

时间: 2024-10-09 23:17:44

从源码角度 解决Volley框架乱码的问题的相关文章

volley源码解析(三)--Volley核心之RequestQueue类

上一篇文章给大家说明了Request<T>的内部结构,对于这个类而言,volley让我们关注的主要请求获得响应以后,怎么根据自己的需要解析响应,然后在主线程中回调监听器的方法,至于是怎么获得响应的,线程又是怎么开启的,都跟Request无关. 前面已经提到,Request会放在队列里面等待线程的提取,RequestQueue类作为volley的核心类,可以说是连接请求与响应的桥梁.另外,RequestQueue类作为一个集合,还给我们统一管理请求带来更大的方便,这样的思想是很值得我们学习的.

从源码角度深入理解Toast

Toast这个东西我们在开发中经常用到,使用也很简单,一行代码就能搞定: 1: Toast.makeText(this, "333", Toast.LENGTH_LONG).show(); 但是我们经常会遇到这样一种情况,比如说我们有两个按钮,每次点击之后就会弹出一个Toast,但是如果这两个按钮快速点击,我们看到的效果是这样的:   但实际上我们想要的效果应该是这样的:   源码解读 看了上面两张效果图的对比之后,我们应该明白了,第一种情况是在我们点击完之后,Toast还在不断的显示

从源码角度了解SpringMVC的执行流程

目录 从源码角度了解SpringMVC的执行流程 SpringMVC介绍 源码分析思路 源码解读 几个关键接口和类 前端控制器 DispatcherServlet 结语 从源码角度了解SpringMVC的执行流程 SpringMVC的执行流程网上有很多帖子都有讲解,流程图和文字描述都很详细,但是你如果没有通过具体源码自己走一遍流程,其实只是死记硬背.所以想开个帖子从源码角度再梳理一遍SpringMVC的执行流程,加深印象. SpringMVC介绍 SpringMVC采用的是前端控制器(Front

从源码角度来修改PreferenceActivity界面

       从源码角度来修改PreferenceActivity界面,布布扣,bubuko.com

Java并发包源码学习之AQS框架(一)概述

AQS其实就是java.util.concurrent.locks.AbstractQueuedSynchronizer这个类. 阅读Java的并发包源码你会发现这个类是整个java.util.concurrent的核心之一,也可以说是阅读整个并发包源码的一个突破口. 比如读ReentrantLock的源码你会发现其核心是它的一个内部类Sync: 整个包中很多类的结构都是如此,比如Semaphore,CountDownLatch都有一个内部类Sync,而所有的Sync都是继承自AbstractQ

从源码角度入手实现RecyclerView的Item点击事件

转载请注明出处:http://www.cnblogs.com/cnwutianhao/p/6758373.html RecyclerView 作为 ListView 和 GridView 的替代产物,相信在Android界已广为流传. RecyclerView 本是不会有类似 ListView 的那种点击事件,但是知道和会用又是两种情况,跟随我一起从源码角度分析,RecyclerView 点击事件. 首先看一下 Google 对 ListView 家族谱的介绍: 可以看出 ListView 归根

object -c OOP , 源码组织 ,Foundation 框架 详解1

?object -c? OOP ,??源码组织??,Foundation?框架?详解1 1.1 So what is OOP? OOP is a way of constructing software composed of objects. Objects are like little machines living inside your computer and talking to each other to get work done. oop?就是由对象构成的软件. 对象就像一些

Snackbar新版Toast 从源码角度完全解析

我们将会从一下几个角度了解Snackbar. 1.什么是Snackbar 2.如何使用Snackbar 3.有哪些常用的API 4.从源码角度分析其实现 5.总结 1.什么是Snackbar Snackbar是一个轻量级的用户操作反馈工具,类似于Toast,但是比Toast更美观和实用,当你操作它的时候,Snackbar会置顶显示一个一定时间的简要的信息在屏幕的底部,并且它还可以添加事件. 2.如何使用Snackbar Snackbar .make(parentLayout, R.string.

Android布局性能优化—从源码角度看ViewStub延迟加载技术

在项目中,难免会遇到这种需求,在程序运行时需要动态根据条件来决定显示哪个View或某个布局,最通常的想法就是把需要动态显示的View都先写在布局中,然后把它们的可见性设为View.GONE,最后在代码中通过控制View.VISIABLE动态的更改它的可见性.这样的做法的优点是逻辑简单而且控制起来比较灵活.但是它的缺点就是,耗费资源,虽然把View的初始可见View.GONE但是在Inflate布局的时候View仍然会被Inflate,也就是说仍然会创建对象,会被实例化,会被设置属性.也就是说,会