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<JSONObject>() {
                    @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<JSONObject>() {
                        @Override
                        public void onResponse(JSONObject obj) {
                            Log.d("------", obj.toString());
                        }
                    }, new Response.ErrorListener() {
                        @Override
                        public void onErrorResponse(VolleyError error) {
                            error.getMessage();
                        }
                    })
            {
    			protected Response<JSONObject>  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<String,String> map=new HashMap<String,String>();
            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<JSONObject>() {
                        @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<String>() {
                @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<String, String> getParams() {
                //在这里设置需要post的参数
                Map<String, String> map = new HashMap<String, String>();  
                map.put("note", notEditText.getText().toString().trim());
                map.put("phoneID", phoneID);  
                return map;
            }

        };        
        requestQueue.add(stringRequest);
	}


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



  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值