在实习期间因为要求使用volley,因此第一次开始接触volley,从一开始的迷茫陌生,到疯狂的查找各类资料,经过在项目中用到的实际问题,我想作一些总结,因此写了这篇文章。下面我将介绍我理解的用户登陆的一套详细流程,涉及到volley请求以及json数据的解析。android
登陆流程的总结:首先经过EditText获取到用户名和密码,而后再执行登陆请求 LoginToServer()里面发送用户名和密码,服务器返回给我json数据(若是用到Oauth 认证这里返回的json数据就应该是Token的一套东西,若是只是简单的登陆,能够和服务器约定返回的内容,提取出对应的内容,包装起来作判断反馈给用户登陆是否成功),我须要把这些json数据解析出来,而后再反馈给用户“登陆成功”或者“登陆失败”。web
LoginActivity.class这里是在登陆界面调用到 LoginToServer()这个方法,这里我把 User_Local.class 里面写了基本的set,get方法,而后是里面是全局(public static)的方法。数据库
1 public void onClick(View v) { 2 switch (v.getId()) { 3 case R.id.login_button: 4 if (checkEdit()) { 5 //这里记得必定要先get得到数据 6 User_Local.setUsername(username.getText().toString()); 7 User_Local.setPassword(password.getText().toString()); 8 // LoginToServer(); 9 new LoginSupport(LoginActivity.this).LoginToServer(); 10 } 11 break;
这里是User_Local.class ,首先这里为何要写成public static,写成这种是说这是全局变量。全局的引用方法就是类名直接引用,不用再new 一个对象。好比这里就是引用直接就是上述的 User_Local.setUsername(username.getText().toString());。何时用全局的,何时不用,这个你们能够百度一下。好比在接受服务器传过来的json数据我要再建一套类去匹配解析,这个时候就不要用全局的。json
1 public class User_Local { 2 3 public static String username = " " ;//用户名 4 public static String password =" ";//密码 5 6 public static String getUsername() { 7 return username; 8 } 9 10 public static void setUsername(String username) { 11 User_Local.username = username; 12 } 13 14 public static String getPassword() { 15 return password; 16 } 17 18 public static void setPassword(String password) { 19 User_Local.password = password; 20 } 21 LoginSupport.class 这个类里面我写了volley的登陆请求,还有服务器返回的json数据解析(这里使用的是Gson来解析json数据),还有反馈给用户登陆成功失败与否 22 23 volley请求简单说就三步:1.添加url地址。2.new 一个请求(请求里面有成功和失败的接口)3.添加请求到请求队列里面去 24 25 这里我只用了volley 里面的StringRequest这个请求,这个请求向服务器发送的应该是字符串吧,我理解的是这样的。而后至于volley的其余请求你们能够参考其余的博客和专业资料。 26 27 public void LoginToServer( ) { 28 String url = "http://XXXXX";//1.这里就是你要向服务器发送请求的地址 29 StringRequest loginRequest = new StringRequest(Request.Method.POST, url, new Response.Listener<String>() {//2.new 一个请求 30 @Override 31 public void onResponse(String s) {//这里是返回正确反馈的接口(只要请求成功反馈的数据都这这里) 32 //数据处理反馈(能够这这里处理服务器返回的数据) 33 DealResponseFromServer(s);//json数据的解析和用户反馈 34 Log.i("TAG",s); 35 } 36 }, new Response.ErrorListener() { 37 @Override 38 public void onErrorResponse(VolleyError volleyError) { 39 //volley 有专门处理error的库,下面就是调用了其中的一些,能够方便调试的时候查找到错误 40 Log.d(TAG, "Volley returned error________________:" + volleyError); 41 Class klass = volleyError.getClass(); 42 if(klass == com.android.volley.AuthFailureError.class) { 43 Log.d(TAG,"AuthFailureError"); 44 Toast.makeText(context,"未受权,请从新登陆",Toast.LENGTH_LONG).show(); 45 } else if(klass == com.android.volley.NetworkError.class) { 46 Log.d(TAG,"NetworkError"); 47 Toast.makeText(context,"网络链接错误,请从新登陆",Toast.LENGTH_LONG).show(); 48 } else if(klass == com.android.volley.NoConnectionError.class) { 49 Log.d(TAG,"NoConnectionError"); 50 } else if(klass == com.android.volley.ServerError.class) { 51 Log.d(TAG,"ServerError"); 52 Toast.makeText(context,"服务器未知错误,请从新登陆",Toast.LENGTH_LONG).show(); 53 } else if(klass == com.android.volley.TimeoutError.class) { 54 Log.d(TAG,"TimeoutError"); 55 Toast.makeText(context,"链接超时,请从新登陆",Toast.LENGTH_LONG).show(); 56 } else if(klass == com.android.volley.ParseError.class) { 57 Log.d(TAG,"ParseError"); 58 } else if(klass == com.android.volley.VolleyError.class) { 59 Log.d(TAG,"General error"); 60 } 61 Toast.makeText(context,"登陆失败",Toast.LENGTH_LONG).show(); 62 } 63 }) 64 { 65 //这里是添加请求头的地方重写了getHeaders() 方法(发送设么请求头要根据本身实际开发须要设定) 66 @Override 67 public Map<String, String> getHeaders() { 68 HashMap<String, String> header = new HashMap<String, String>(); 69 header.put("Accept","application/json"); 70 header.put("Content-Type","application/x-www-form-urlencoded"); 71 return header; 72 } 73 74 //这里是发送参数的地方,重写了 getParams() 方法(传什么参数给服务器也是实际你本身修改) 75 @Override 76 protected Map<String, String> getParams() { 77 HashMap<String, String> map = new HashMap<String, String>(); 78 79 //若是出现空指针异常或者是登陆失败,先检查这里有木有传进来你要发送的用户名和密码。 80 //因此在执行get数据方法以前必定要先存数据(set方法) 81 map.put("username", User_Local.getUsername()); 82 map.put("password", User_Local.getPassword()); 83 return map; 84 } 85 }; 86 //设置超时从新请求 87 loginRequest.setRetryPolicy(new DefaultRetryPolicy(5000, DefaultRetryPolicy.DEFAULT_MAX_RETRIES, 88 DefaultRetryPolicy.DEFAULT_BACKOFF_MULT)); 89 //设置标签,方便在stop(){}里面取消对应的volley 请求 90 loginRequest.setTag("POST"); 91 //3.把请求添加到全局请求队列里面 92 MyApplication.getHttpQueue().add(loginRequest); 93 }
1 //创建一个全局请求队列 2 public class MyApplication extends Application { 3 public static RequestQueue requestQueue;// 4 5 @Override 6 public void onCreate() { 7 super.onCreate(); 8 requestQueue = Volley.newRequestQueue(getApplicationContext()); 9 } 10 11 public static RequestQueue getHttpQueue(){ 12 return requestQueue; 13 } 14 }
Gson解析json数据的精华就是:
gson.fromJson(就是把json数据解析成普通数据)和gson.toJson(把普通数据转化成json类型的数据格式)
要注意的是,这里解析到服务器的数据必须有一套模型和服务器里面的各类数据类型匹配,也就是你须要根据传过来的json数据建一个类来把解析的数据保存起来。服务器
1 //解析服务器返回的json字符串反馈给用户 2 public void DealResponseFromServer(String s) { 3 Gson gson = new Gson();//第一步,实例化 4 User_Service user_service = gson.fromJson(s, User_Service.class);//第二步,解析数据 5 if (s!=null) {//这里的s就是上面成功回调接口里面的参数 6 //这里我保存了从服务器返回的token的信息,至于token就涉及到oauth2.0的内容了,不懂得能够百度, 7 //固然这里能够保持你须要保存的服务器返回的数据 8 PreferenceUtils.setPrefString(context,User_Service.userKey, "access_token", user_service.getAccess_token());//保存令牌(这里我用的是本身写的一套SharedPreferences的工具类来保存token) 9 PreferenceUtils.setPrefString(context,User_Service.userKey, "refresh_token", user_service.getRefresh_token());//保存刷新令牌 10 Toast.makeText(context, "登陆成功", Toast.LENGTH_SHORT).show();//反馈给用户登陆成功 11 } 12 }
这个就是用于接收服务器返回的json数据类型所创建的类,专门用于解析json数据的。这里的变量就不用设置成全局的变量。
这里面的关系我捋一下,1.从服务器解析的json数据保存到本地数据库里面2.而后本地须要调用数据的时候,再去数据库里面去取。网络
1 //用于接收解析服务器返回数据所给的数据 2 public class User_Service { 3 public static final String userKey = "user_service";//用于保存服务器端传回的数据文件 4 private String access_token;//令牌 5 private String refresh_token;//刷新令牌 6 7 public String getAccess_token() { 8 return access_token; 9 } 10 11 public void setAccess_token(String access_token) { 12 this.access_token = access_token; 13 } 14 15 public void setRefresh_token(String refresh_token) { 16 this.refresh_token = refresh_token; 17 } 18 19 public String getRefresh_token() { 20 return refresh_token; 21 }