最近有个小项目,是用Volley连接服务器传送数据和handler处理消息,这是别人写的项目,但是我要改动,所以也要了解一下。/(ㄒoㄒ)/~~
废话不多说,文章的内容分为以下几步:
1.Volley如何连接服务器,方法及具体解释。
2.根据服务器返回消息,进行具体操作,以登录功能为例源码。
首先,Volley属于一种网络通讯框架,它的使用非常简单。
1.拿到RequestQueue对象。当然在Android的Activity中context这个参数就是ActivityName.this。
`RequestQueue mQueue = Volley.newRequestQueue(context);`
2.发送http请求。StringRequest的构造方法里面包含以下几个基本参数。
`StringRequest stringRequest = new StringRequest(params)`
第一个参数params[0]: url,第二个参数params[1]:`new Response.Listener() {
@Override
public void onResponse(String response) {
Log.d("TAG", response);
}
}`这是一个Response服务器响应成功的监听函数,在响应成功后,可以再onResponse方法中写后续执行操作, 第三个参数params[2]:`new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Log.e("TAG", error.getMessage(), error);
}
}`这是Response服务器响应失败的监听函数,可以再onErrorResponse中写响应失败后的提示语句等信息。
除此三个最基本的参数外(默认GET请求),还有一种四个参数的请求函数。最后将StringRequest对象传给mQueue对象。
StringRequest stringRequest = new StringRequest(Request.Method.POST,url,new Response.Listener<String>() {
@Override
public void onResponse(String response) {
Log.d("TAG", response);
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Log.e("TAG", error.getMessage(), error);
}
mQueue.add(request);
此时连接服务器已经完成。
3.当需要向服务器传递参数时,需要用Request.Method.POST方法。
我们将StringRequest的方法以及需要执行的一系列函数写在一个单独的类中。
public class RequestUtil{
//声明一个message消息,在Activity中会根据消息不一样进行不一样的操作
public static final int HANDLER_WHAT_INFO = 1;
/**
*
* @param context Activity.this 上下文参数
* @param mQueue 请求队列 RequestQueue对象
* @param method GET/POST
* @param url url
* @param params 参数的Map,没有参数请传null
* @param mhandler handler
* @param what handler 里message的what的值
* @param time_count timeout的时间 2.5秒的多少倍
*/
public static void basicRequest(final Context context, RequestQueue mQueue, final int method,
final String url, final Map params,
final Handler mhandler, final int what) {
StringRequest request = new StringRequest(method, getUrl(url), new Response.Listener() {
@Override
public void onResponse(String s) {
Log.i("REQ",s);
//这是一个Bean,里面有很多字段,这个是根据服务器的返回字段决定
ResponseBean bean;
bean = JsonUtil.jsonToObj(s, ResponseBean.class);
if (bean.getStatus() != 0) {
//toast 错误提示
Toast.makeText(context, bean.getMsg(), Toast.LENGTH_SHORT).show();
}
//当服务器连接成功后,用Message对象传递消息,在Activity中处理。
Message message = new Message();
message.what = what;
message.obj = bean;
mhandler.sendMessage(message);
}
}, errorListener = new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError volleyError) {
if (volleyError.networkResponse == null) {
Toast.makeText(context, "网络连接错误", Toast.LENGTH_SHORT).show();
} else if (volleyError.networkResponse.statusCode == 408) {
Toast.makeText(context, "网络连接超时", Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(context, "服务器内部错误", Toast.LENGTH_SHORT).show();
}
}
}) {
//当发送POST请求时,Volley会调用父类的getParams函数来得到发送给服务器的参数
//此处重写getParams这个方法,取得参数值
@Override
protected Map getParams() throws AuthFailureError {
Map paramsTemp;
if (method == Method.GET || params == null) {
paramsTemp = super.getParams();
} else {
paramsTemp = params;
Log.i("HTTP POST Request:",super.getUrl()+"-"+params.toString());
}
return paramsTemp;
}
mQueue.add(request);
}
}
}
这个封装的类写完了之后,就可以再Activity中调用并根据服务器的Message传递的信息进行操作。
这里随便贴一下ResponseBean这个类:
public class ResponseBean {
public String id;
public int status;
public Object result;
public String msg;
public boolean success;
public String getId() {
return id;
}
public int getStatus() {
return status;
}
public Object getResult() {
return result;
}
public String getMsg() {
return msg;
}
public boolean isSuccess() {
return success;
}
@Override
public String toString() {
return "ResponseBean{" +
"id='" + id + '\'' +
", status=" + status +
", result=" + result +
", msg='" + msg + '\'' +
", success=" + success +
'}';
}
}
下面是在Activity中如何操作的详细解释:
RequestQueue mQueue = Volley.newRequestQueue(this);
Map<String, String> params = new HashMap<String, String>();
params.put(KEY, value);
//调用RequestUtil中的basicRequest方法连接服务器
RequestUtil.basicRequest(this, mQueue, Request.Method.POST,
url, params,
mhandler, HANDLER_WHAT_INFO);
//handler用来处理消息
Handler handler =new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
ResponseBean bean;
switch (msg.what){
//如果服务器是这个信息,做相应的处理
case Common.HANDLER_WHAT_INFO:
Log.i("ONC","STOCKIN_UNSTOCKINS_LO ");
bean= (ResponseBean) msg.obj;
if(bean.getStatus()==0){
String result = JsonUtil.objToJson(bean.getResult());
}
//这里可有很多种case选择,不同的服务器返回执行不同的代码
//...
}