Json是一种轻量级的数据交换格式,可以将JavaScript对象中表示的一组数据转化为字符串,然后就可以在函数之间轻松地传递这个字符串,或者在异步应用程序中将字符串从 Web 客户机传递给服务器端程序。
Volley简介:2013年Google I/O大会上推出了一个新的网络通信框架——Volley。Volley可是说是把Volley可是说是把AsyncHttpClient和
Universal-Image-Loader的优点集于了一身,既可以像AsyncHttpClient一样非常简单地进行HTTP通信,也可以像Universal-Image-Loader一样轻松加载网络上的图片。除了简单易用之外,Volley在性能方面也进行了大幅度的调整,它的设计目标就是非常适合去进行数据量不大,但通信频繁的网络操作,而对于大数据量的网络操作,比如说下载文件等,Volley的表现就会非常糟糕。
Volley的用法非常简单,那么我们就从最基本的HTTP通信开始学习吧,即发起一条HTTP请求,然后接收HTTP响应。首先需要获取到一个RequestQueue对象,可以调用如下方法获取到:
public void goToServer(String url) {
Log.i("baseURL------>", url);
final String TAGLOGIN = "LoginToServer----";
//测试用POST方法测试接口
StringRequest loginRequest = new StringRequest(Request.Method.POST, url, new Response.Listener() {
//这里是返回正确反馈的接口,数据处理反馈(可以这这里处理服务器返回的数据)
@Override
public void onResponse(String jsonResponseFromServer) {
Log.i("TAGLOGIN", "POST请求成功,结果:" + jsonResponseFromServer.toString());
if (dealResponseFromServer(jsonResponseFromServer)) {
Toast.makeText(LoginPageActivity.this, "登录成功", Toast.LENGTH_SHORT).show();
Intent intent = new Intent(LoginPageActivity.this, MainActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
} else {
Toast.makeText(LoginPageActivity.this, loginResult, Toast.LENGTH_SHORT).show();
return;
}
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError volleyError) {
//volley 有专门处理error的库,下面就是调用了其中的一些,可以方便调试的时候查找到错误
Log.d(TAGLOGIN, "Volley returned error________________:" + volleyError);
Class klass = volleyError.getClass();
if (klass == com.android.volley.AuthFailureError.class) {
Log.d("------", "AuthFailureError");
Toast.makeText(LoginPageActivity.this, "未授权,请重新登录", Toast.LENGTH_LONG).show();
} else if (klass == com.android.volley.NetworkError.class) {
Log.d("------", "NetworkError");
Toast.makeText(LoginPageActivity.this, "网络连接错误,请重新登录", Toast.LENGTH_LONG).show();
} else if (klass == com.android.volley.NoConnectionError.class) {
Log.d("------", "NoConnectionError");
} else if (klass == com.android.volley.ServerError.class) {
Log.d("------", "ServerError");
Toast.makeText(LoginPageActivity.this, "服务器未知错误,请重新登录", Toast.LENGTH_LONG).show();
} else if (klass == com.android.volley.TimeoutError.class) {
Log.d("------", "TimeoutError");
Toast.makeText(LoginPageActivity.this, "连接超时,请重新登录", Toast.LENGTH_LONG).show();
} else if (klass == com.android.volley.ParseError.class) {
Log.d("------", "ParseError");
} else if (klass == com.android.volley.VolleyError.class) {
Log.d("------", "General error");
}
Toast.makeText(LoginPageActivity.this, "登录失败", Toast.LENGTH_LONG).show();
}
}) {
//这里是发送客户端输入参数的地方,重写getParams()方法
@Override
protected Map getParams() {
HashMap map = new HashMap();
//如果出现空指针异常或者是登录失败,先检查这里有木有传进来你要发送的用户名和密码。
//所以在执行get数据方法之前一定要先存数据(set方法)
map.put("phone", login_username_et.getText().toString());
map.put("password", login_password_et.getText().toString());
Log.i("phone--->>>", login_username_et.getText().toString());
Log.i("password--->>>", login_password_et.getText().toString());
return map;
}
};
//设置超时重新请求
loginRequest.setRetryPolicy(new DefaultRetryPolicy(5000, DefaultRetryPolicy.DEFAULT_MAX_RETRIES,
DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
//设置标签,方便在stop(){}里面取消对应的volley 请求
loginRequest.setTag("POST");
//3.把请求添加到全局请求队列里面
LoginPageActivity.getHttpQueue().add(loginRequest);
}
// 对请求回来的json数据进行判断取回状态
public boolean dealResponseFromServer(String jsonResponseFromServer) {
Log.i("serverResponse-----", jsonResponseFromServer.toString());
// jsonResponseFromServer = {"action":"login","result":"登陆成功","status":"true"}
JSONObject jsonObject = JSON.parseObject(jsonResponseFromServer);
String loginStatus = jsonObject.getString("status");
loginResult = jsonObject.getString("result");
if (loginStatus.equals("true")) {
return true;
} else {
return false;
}
}
说明:
这里new出了一个StringRequest对象,StringRequest的构造函数需要传入三个参数,第一个参数就是目标服务器的URL地址;第二个参数onResponse是服务器响应成功的回调,例如可以将传回来的json字符串通过fastJson 解析取出数据给我们的控件可视化;第三个参数onErrorResponse是服务器响应失败的回调。其中,目标服务器地址我写的是请求登录信息,然后在响应成功的回调里打印出服务器返回的内容,在响应失败的回调里打印出失败的详细信息。getParams() 这个方法是我们请求服务器json接口时需要的参数,以map键值对的方式给服务器发送过去,重写onResponse()方法将服务器返回的数据利用起来。