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);
}