Android实战:使用Volley框架访问服务器Json数据

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()方法将服务器返回的数据利用起来。

你可能感兴趣的:(android开发经验)