Android Volley连接服务器并操作返回数据

    最近有个小项目,是用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选择,不同的服务器返回执行不同的代码
                    //...
}

你可能感兴趣的:(android,Volley,框架,返回数据)