在实习期间由于要求使用volley,所以第一次开始接触volley,从一开始的迷茫陌生,到疯狂的查找各种资料,通过在项目中用到的实际问题,我想做一些总结,所以写了这篇文章。下面我将介绍我理解的用户登录的一套详细流程,涉及到volley请求以及json数据的解析。

登录流程的总结:首先通过EditText获取到用户名和密码,然后再执行登录请求 LoginToServer()里面发送用户名和密码,服务器返回给我json数据(如果用到Oauth 认证这里返回的json数据就应该是Token的一套东西,如果只是简单的登录,可以和服务器约定返回的内容,提取出对应的内容,包装起来做判断反馈给用户登录是否成功),我需要把这些json数据解析出来,然后再反馈给用户“登录成功”或者“登录失败”。

LoginActivity.class这里是在登录界面调用到 LoginToServer()这个方法,这里我把 User_Local.class 里面写了基本的set,get方法,然后是里面是全局(public static)的方法。

  public void onClick(View v) {
switch (v.getId()) {
case R.id.login_button:
if (checkEdit()) {
//这里记得一定要先get获得数据
User_Local.setUsername(username.getText().toString());
User_Local.setPassword(password.getText().toString());
// LoginToServer();
new LoginSupport(LoginActivity.this).LoginToServer();
}
break;

这里是User_Local.class ,首先这里为什么要写成public static,写成这种是说这是全局变量。全局的引用方法就是类名直接引用,不用再new 一个对象。比如这里就是引用直接就是上述的 User_Local.setUsername(username.getText().toString());。什么时候用全局的,什么时候不用,这个大家可以百度一下。比如在接受服务器传过来的json数据我要再建一套类去匹配解析,这个时候就不要用全局的。

 public class User_Local {

     public static String username = " " ;//用户名
public static String password =" ";//密码 public static String getUsername() {
return username;
} public static void setUsername(String username) {
User_Local.username = username;
} public static String getPassword() {
return password;
} public static void setPassword(String password) {
User_Local.password = password;
}
LoginSupport.class 这个类里面我写了volley的登录请求,还有服务器返回的json数据解析(这里使用的是Gson来解析json数据),还有反馈给用户登录成功失败与否 volley请求简单说就三步:1.添加url地址。2.new 一个请求(请求里面有成功和失败的接口)3.添加请求到请求队列里面去 这里我只用了volley 里面的StringRequest这个请求,这个请求向服务器发送的应该是字符串吧,我理解的是这样的。然后至于volley的其他请求大家可以参考其他的博客和专业资料。 public void LoginToServer( ) {
String url = "http://XXXXX";//1.这里就是你要向服务器发送请求的地址
StringRequest loginRequest = new StringRequest(Request.Method.POST, url, new Response.Listener<String>() {//2.new 一个请求
@Override
public void onResponse(String s) {//这里是返回正确反馈的接口(只要请求成功反馈的数据都这这里)
//数据处理反馈(可以这这里处理服务器返回的数据)
DealResponseFromServer(s);//json数据的解析和用户反馈
Log.i("TAG",s);
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError volleyError) {
//volley 有专门处理error的库,下面就是调用了其中的一些,可以方便调试的时候查找到错误
Log.d(TAG, "Volley returned error________________:" + volleyError);
Class klass = volleyError.getClass();
if(klass == com.android.volley.AuthFailureError.class) {
Log.d(TAG,"AuthFailureError");
Toast.makeText(context,"未授权,请重新登录",Toast.LENGTH_LONG).show();
} else if(klass == com.android.volley.NetworkError.class) {
Log.d(TAG,"NetworkError");
Toast.makeText(context,"网络连接错误,请重新登录",Toast.LENGTH_LONG).show();
} else if(klass == com.android.volley.NoConnectionError.class) {
Log.d(TAG,"NoConnectionError");
} else if(klass == com.android.volley.ServerError.class) {
Log.d(TAG,"ServerError");
Toast.makeText(context,"服务器未知错误,请重新登录",Toast.LENGTH_LONG).show();
} else if(klass == com.android.volley.TimeoutError.class) {
Log.d(TAG,"TimeoutError");
Toast.makeText(context,"连接超时,请重新登录",Toast.LENGTH_LONG).show();
} else if(klass == com.android.volley.ParseError.class) {
Log.d(TAG,"ParseError");
} else if(klass == com.android.volley.VolleyError.class) {
Log.d(TAG,"General error");
}
Toast.makeText(context,"登录失败",Toast.LENGTH_LONG).show();
}
})
{
//这里是添加请求头的地方重写了getHeaders() 方法(发送设么请求头要根据自己实际开发需要设定)
@Override
public Map<String, String> getHeaders() {
HashMap<String, String> header = new HashMap<String, String>();
header.put("Accept","application/json");
header.put("Content-Type","application/x-www-form-urlencoded");
return header;
} //这里是发送参数的地方,重写了 getParams() 方法(传什么参数给服务器也是实际你自己修改)
@Override
protected Map<String, String> getParams() {
HashMap<String, String> map = new HashMap<String, String>(); //如果出现空指针异常或者是登录失败,先检查这里有木有传进来你要发送的用户名和密码。
//所以在执行get数据方法之前一定要先存数据(set方法)
map.put("username", User_Local.getUsername());
map.put("password", User_Local.getPassword());
return map;
}
};
//设置超时重新请求
loginRequest.setRetryPolicy(new DefaultRetryPolicy(5000, DefaultRetryPolicy.DEFAULT_MAX_RETRIES,
DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
//设置标签,方便在stop(){}里面取消对应的volley 请求
loginRequest.setTag("POST");
//3.把请求添加到全局请求队列里面
MyApplication.getHttpQueue().add(loginRequest);
}
 //建立一个全局请求队列
public class MyApplication extends Application {
public static RequestQueue requestQueue;// @Override
public void onCreate() {
super.onCreate();
requestQueue = Volley.newRequestQueue(getApplicationContext());
} public static RequestQueue getHttpQueue(){
return requestQueue;
}
}

Gson解析json数据的精华就是: 
gson.fromJson(就是把json数据解析成普通数据)和gson.toJson(把普通数据转化成json类型的数据格式) 
要注意的是,这里解析到服务器的数据必须有一套模型和服务器里面的各种数据类型匹配,也就是你需要根据传过来的json数据建一个类来把解析的数据保存起来。

 //解析服务器返回的json字符串反馈给用户
public void DealResponseFromServer(String s) {
Gson gson = new Gson();//第一步,实例化
User_Service user_service = gson.fromJson(s, User_Service.class);//第二步,解析数据
if (s!=null) {//这里的s就是上面成功回调接口里面的参数
//这里我保存了从服务器返回的token的信息,至于token就涉及到oauth2.0的内容了,不懂得可以百度,
//当然这里可以保持你需要保存的服务器返回的数据
PreferenceUtils.setPrefString(context,User_Service.userKey, "access_token", user_service.getAccess_token());//保存令牌(这里我用的是自己写的一套SharedPreferences的工具类来保存token)
PreferenceUtils.setPrefString(context,User_Service.userKey, "refresh_token", user_service.getRefresh_token());//保存刷新令牌
Toast.makeText(context, "登录成功", Toast.LENGTH_SHORT).show();//反馈给用户登录成功
}
}

这个就是用于接收服务器返回的json数据类型所建立的类,专门用于解析json数据的。这里的变量就不用设置成全局的变量。 
这里面的关系我捋一下,1.从服务器解析的json数据保存到本地数据库里面2.然后本地需要调用数据的时候,再去数据库里面去取。

 //用于接收解析服务器返回数据所给的数据
public class User_Service {
public static final String userKey = "user_service";//用于保存服务器端传回的数据文件
private String access_token;//令牌
private String refresh_token;//刷新令牌 public String getAccess_token() {
return access_token;
} public void setAccess_token(String access_token) {
this.access_token = access_token;
} public void setRefresh_token(String refresh_token) {
this.refresh_token = refresh_token;
} public String getRefresh_token() {
return refresh_token;
}

用户登录流程详解 +volley(StringRequest)的更多相关文章

  1. SCP免密传输和SSH登录流程详解

    SCP免密传输和SSH登录协议详解 在linux下开发时,经常需要登录到其他的设备上,例如虚拟机内ubuntu.树莓派等等,经常涉及到传输文件的操作,传输文件有很多中方法,如物理磁盘拷贝,基于网络的s ...

  2. 二维码闪电登录流程详解,附demo(1/2)

    二维码,最早发明于日本,它是用某种特定的几何图形按一定规律在平面(二维方向上)分布的黑白相间的图形记录数据符号信息的,使用若干个与二进制相对应的几何形体来表示文字数值信息,通过图象输入设备或光电扫描设 ...

  3. 二维码闪电登录流程详解,附demo(2/2)

    上篇文章,我们重点介绍了一下二维码登录的流程,以及每个“角色”要做的事情,下面我们重点分析TV角色所做的工作. TV主要完成二维码图片显示,以及websocket请求.下面重点说一下这两点. 1. B ...

  4. uniapp登录流程详解uni.login

    uni.login(OBJECT)登录 H5平台登陆注意事项: 微信内嵌浏览器运行H5版时,可通过js sdk实现微信登陆,需要引入一个单独的js,详见普通浏览器上实现微信登陆,并非开放API,需要向 ...

  5. vsftp虚拟用户登录配置详解

    一.安装:1.安装Vsftpd服务:# yum install vsftpd 2.安装DB4部件包:这里要特别安装一个db4的包,用来支持文件数据库.# yum install db4-utils 二 ...

  6. Linux启动流程详解【转载】

    在BIOS阶段,计算机的行为基本上被写死了,可以做的事情并不多:一般就是通电.BIOS.主引导记录.操作系统这四步.所以我们一般认为加载内核是linux启动流程的第一步. 第一步.加载内核 操作系统接 ...

  7. Linux 用户及权限详解

    Linux 用户及权限详解 用户 , 组 ,权限 安全上下文(secure context): 权限: r,w,x 文件: r : 可读,可以使用类似cat 等命令查看文件内容. w : 可写,可以编 ...

  8. Lucene系列六:Lucene搜索详解(Lucene搜索流程详解、搜索核心API详解、基本查询详解、QueryParser详解)

    一.搜索流程详解 1. 先看一下Lucene的架构图 由图可知搜索的过程如下: 用户输入搜索的关键字.对关键字进行分词.根据分词结果去索引库里面找到对应的文章id.根据文章id找到对应的文章 2. L ...

  9. unity3d-配置Android环境,打包发布Apk流程详解

    31:unity3d-配置Android环境,打包发布Apk流程详解 作者 阿西纳尼 关注 2016.08.28 22:52 字数 498 阅读 1806评论 0喜欢 5 Unity配置Android ...

随机推荐

  1. Linux鲜为人知的安全漏洞:不要将输出内容管道给你的shell

    将wget或curl输出的内容管道给bash或者sh是一件非常愚蠢的事,例如像下面这样: wget -O - http://example.com/install.sh | sudo sh 命令解释: ...

  2. 开始使用pycharm了

    我将python的主力开发工具从eclipse+pydev切换到pycharm社区版了. 选择pycharm 的原因:1. pycharm可以实时按照pep8的规范检查code style和namin ...

  3. HTTP报文详解

    二.HTTP请求首部字段 1 Accept 2 Accept-Charset 3 Accept-Encoding 4 Accept-Language 5 Authorization 6

  4. 【AngularJS】—— 10 指令的复用

    前面练习了如何自定义指令,这里练习一下指令在不同的控制器中如何复用. —— 来自<慕课网 指令3> 首先看一下一个小例子,通过自定义指令,捕获鼠标事件,并触发控制器中的方法. 单个控制器的 ...

  5. Linux中的运行级

    1. Linux系统有7个运行级别(runlevel): 运行级别0:系统停机状态,系统默认运行级别不能设为0,否则不能正常启动 运行级别1:单用户工作状态,root权限,用于系统维护,禁止远程登陆 ...

  6. Todd's Matlab讲义第5讲:二分法和找根

    二分法和if ... else ... end 语句 先回顾一下二分法.要求方程\(f(x)=0\)的根.假设\(c = f(a) < 0\)和\(d = f(b) > 0\),如果\(f ...

  7. 浅谈checkpoint与内存缓存

    事务日志存在检查点checkpoint,把内存中脏数据库写入磁盘,以减少故障恢复的时间,在此之前有必要提下SQL Server内存到底存放了哪些数据? SQL Server内存使用 对SQL Serv ...

  8. POJ 3744 Scout YYF I

    分段的概率DP+矩阵快速幂                        Scout YYF I Time Limit: 1000MS   Memory Limit: 65536K Total Sub ...

  9. Swift2.1 语法指南——可空链式调用

    原档:https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/Swift_Programmi ...

  10. CentOS 6.5 3.0.4安装agentd

    更改主机名为test3 [root@localhost ~]# cat /etc/sysconfig/network NETWORKING=yes HOSTNAME=test3 关闭selinux [ ...