volley获取json数据及中文乱码问题的解决

volley访问网络不用自己再开启线程,感觉要方便很多。

使用Volley以Http get的方式请求JSONObject对象,要使用JsonObjectRequest类的构造方法。

new JsonObjectRequest(url,jsonObject,listener)去构造一个请求request。

jsonObject:需要传递的数据,如果是以get方式传递,则为null,如果是以post方式传递,则需要设置数据。


首先获取一个请求队列:

[java]  view plain  copy
  1. RequestQueue queue = Volley.newRequestQueue(this);  

然后实现请求类:它的第一个参数是获取数据的方式,post或是get;后两个参数是两个监听,一个是成功,一个是失败

[java]  view plain  copy
  1. JsonObjectRequest objRequest = new JsonObjectRequest(Request.Method.GET,url, null,  
  2.                 new Response.Listener() {  
  3.                     @Override  
  4.                     public void onResponse(JSONObject obj) {  
  5.                         Log.d("------", obj.toString());  
  6.                     }  
  7.                 }, new Response.ErrorListener() {  
  8.                     @Override  
  9.                     public void onErrorResponse(VolleyError error) {  
  10.                         error.getMessage();  
  11.                     }  
  12.                 });  
再将请求加入队列:

[java]  view plain  copy
  1. queue.add(objRequest);  

像上边这样就可以获得一段json数据obj。但我获取的数据是utf-8格式的,当我打印它的时候发现汉字内容是乱码。上网找到了 原因和解决方法

  • [html]  view plain  copy
    1. 如果在服务器的返回数据的header中没有指定字符集那么就会默认使用 ISO-8859-1 字符集。   
    2. ISO-8859-1的别名叫做Latin1。这个字符集支持部分是用于欧洲的语言,不支持中文~   
    3. 很不能理解为什么将这个字符集作为默认的字符集。Volley这个框架可是要用在网络通信的环境中的。   
    4. 吐槽也没有用,我们来看一下如何来解决中文乱码的问题。有以下几种解决方式:  
    5. 在服务器的返回的数据的header的中contentType加上charset=UTF-8的声明。  
    6. 当你无法修改服务器程序的时候,可以定义一个新的子类。覆盖parseNetworkResponse这个方法,直接使用UTF-8对服务器的返回数据进行转码。   
    所以就给他重写那个方法,就像下面这样:
  • [java]  view plain  copy
    1. JsonObjectRequest objRequest = new JsonObjectRequest(Request.Method.GET,url, null,  
    2.                new Response.Listener() {  
    3.                    @Override  
    4.                    public void onResponse(JSONObject obj) {  
    5.                        Log.d("------", obj.toString());  
    6.                    }  
    7.                }, new Response.ErrorListener() {  
    8.                    @Override  
    9.                    public void onErrorResponse(VolleyError error) {  
    10.                        error.getMessage();  
    11.                    }  
    12.                })  
    13.        {  
    14.         protected Response  parseNetworkResponse(NetworkResponse response)  
    15.         {  
    16.         JSONObject jsonObject;  
    17.             try {  
    18.             jsonObject = new JSONObject(new String(response.data,"UTF-8"));  
    19.             return Response.success(jsonObject, HttpHeaderParser.parseCacheHeaders(response));  
    20.             } catch (UnsupportedEncodingException e) {  
    21.             e.printStackTrace();  
    22.             return Response.error(new ParseError(e));  
    23.             } catch (JSONException e) {  
    24.             e.printStackTrace();  
    25.             return Response.error(new ParseError(e));  
    26.             }  
    27.         }  
    28.     };  
    29.        queue.add(objRequest);  
    再次打印结果就是正常的汉字了。
    如果是以Post方式去请求,需要设置post的数据。
  • [java]  view plain  copy
    1. Map map=new HashMap();  
    2.         map.put("token""AbCdEfGh123456");  
    3.         JSONObject params=new JSONObject(map);  
    4.            
    5.         RequestQueue queue = Volley.newRequestQueue(this);  
    6.         String url = "http://m.weather.com.cn/data/101201401.html";  
    7.         JsonObjectRequest objRequest = new JsonObjectRequest(url, params,  
    8.                 new Response.Listener() {  
    9.                     @Override  
    10.                     public void onResponse(JSONObject obj) {  
    11.                         Log.d("---",obj.toString());  
    12.                     }  
    13.                 }, new Response.ErrorListener() {  
    14.                     @Override  
    15.                     public void onErrorResponse(VolleyError error) {  
    16.                         error.getMessage();  
    17.                     }  
    18.    
    19.                 });  
使用StringRequest方法 post传值
[java]  view plain  copy
  1. protected void upLoad() {  
  2.     Log.d(tag, "upLoad");  
  3.        RequestQueue requestQueue = Volley.newRequestQueue(getApplicationContext());  
  4.        StringRequest stringRequest = new StringRequest(Request.Method.POST,url,  
  5.            new Response.Listener() {  
  6.                @Override  
  7.                public void onResponse(String response) {  
  8.                    Log.d("upLoad ---""response -> " + response);  
  9.                }  
  10.            }, new Response.ErrorListener() {  
  11.                @Override  
  12.                public void onErrorResponse(VolleyError error) {  
  13.                    Log.e("upLoad error", error.getMessage(), error);  
  14.                }  
  15.            })   
  16.        {  
  17.            @Override  
  18.            protected Map getParams() {  
  19.                //在这里设置需要post的参数  
  20.                Map map = new HashMap();    
  21.                map.put("note", notEditText.getText().toString().trim());  
  22.                map.put("phoneID", phoneID);    
  23.                return map;  
  24.            }  
  25.   
  26.        };          
  27.        requestQueue.add(stringRequest);  
  28. }  


代码打包 http://download.csdn.net/detail/qq_21856521/9290609

你可能感兴趣的:(Android中常用的工具类)