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

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

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

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

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


首先获取一个请求队列:

RequestQueue queue = Volley.newRequestQueue(this);

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

JsonObjectRequest objRequest = new JsonObjectRequest(Request.Method.GET,url, null,
                new Response.Listener() {
                    @Override
                    public void onResponse(JSONObject obj) {
                        Log.d("------", obj.toString());
                    }
                }, new Response.ErrorListener() {
                    @Override
                    public void onErrorResponse(VolleyError error) {
                        error.getMessage();
                    }
                });
再将请求加入队列:

queue.add(objRequest);

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

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

        };        
        requestQueue.add(stringRequest);
	}


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



你可能感兴趣的:(Android)