Android客户端实现注册、登录详解(1),android客户端

3
回复
579
查看
[复制链接]

501

主题

1206

帖子

2041

安币

手工艺人

发表于 2017-12-27 14:20:50 | 显示全部楼层 |阅读模式

        我们在开发安卓app时难免要与服务器打交道,尤其是对于用户账号信息的注册与登录更是每个android开发人员必须掌握的技能,本文将对客户端的注册/登录功能的实现进行分析,不到之处还请指出。

        

        在这里我们仅讨论客户端如何请求服务器进行注册,而服务器在收到客户端请求后进行的一系列操作并不在本文所述范围内,有兴趣大家可以参考

        请求服务器

        客户端在进行用户信息的注册和登录时一般使用post请求(携带参数)去服务器。以volley框架请求服务器为例,真正与服务器进行交互的就是如下代码:

[Java] 查看源文件 复制代码
stringrequest request=new stringrequest(method.post, url, new listener<string>() {

 //请求成功
 @override
 public void onresponse(string s) {
 //执行请求成功的回调
 callback.onsuccess()
 }

 }, new errorlistener() {

 //请求错误
 @override
 public void onerrorresponse(volleyerror volleyerror) {
 //执行请求失败的回调
 callback.onfailure()
 }
 }){

 //携带参数(map集合)
 @override
 protected map<string, string> getparams() throws authfailureerror {
 return parames;
 }
 };

 //将请求添加到请求队列中
 volley.newrequestqueue(context).add(request);

        当然,我们在请求服务器成功或失败时应该设置相应的回调方法,让我们能够进行一些操作。

[Java] 查看源文件 复制代码
 成功
 {
 "ret":0,
 "errcode":0,
 "msg":"接口调用成功",
 "data":{
 "userid":"16489",
 "email":"nnn@aaa.com",
 "nickname":"duss",
 "userhead":"http://img.itlanbao.com/avatar.png"
 } 
 }

 失败
 {
 "ret":1,
 "errcode":1,
 "msg":"接口调用失败"
 }

        demo演示

        

        主要实现代码(demo会在文章最后给出)

        1.注册页面中(registeractivity),点击注册按钮

[Java] 查看源文件 复制代码
 registbtn.setonclicklistener(new button.onclicklistener() {

 @override
 public void onclick(view v) {
 // todo auto-generated method stub
 //获得用户输入的信息
 string nick = loginnick.gettext().tostring();
 string emailstr = email.gettext().tostring();
 string passwordstr = password.gettext().tostring();
 if (!textutils.isempty(nick) &&
  !textutils.isempty(emailstr)
  && !textutils.isempty(passwordstr)) {
 if (utils.isemail(emailstr)) {//验证邮箱格式是否符合

  //调用requestapidata中的getregistdata()方法进行注册,传入用户输入的昵称,邮箱、密码,以及解析数据的bean对象和callback对象(回调到自身)
  requestapidata.getinstance().getregistdata(nick, emailstr, passwordstr,
  analyticalregistinfo.class, registeractivity.this);
 } else {
  toast.maketext(registeractivity.this, "输入邮箱有误", toast.length_short).show();
 }
 } else {
 toast.maketext(registeractivity.this, "输入信息未完全", toast.length_short).show();
 }
 }
 });

        注意:这个注册的方法中,我们传入的最后一个参数是回调的对象,这里我们传入的是registeractivity自身,所以它需要实现

[Java] 查看源文件 复制代码
httpresponecallback接口
 requestapidata.getinstance().getregistdata(nick, emailstr, passwordstr,
  analyticalregistinfo.class, registeractivity.this);

        2.请求服务器的回调接口(httpresponecallback)

[Java] 查看源文件 复制代码
 public interface httpresponecallback {
 public void onresponestart(string apiname);

 /**
 * 此回调只有调用download方法下载数据时才生效
 * 
 * @param apiname
 * @param count
 * @param current
 */
 public void onloading(string apiname, long count, long current);

 public void onsuccess(string apiname, object object);

 public void onfailure(string apiname, throwable t, int errorno, string strmsg);

}

        3.网络接口类(requestapidata)

[Java] 查看源文件 复制代码
 public class requestapidata {
 private static requestapidata instance = null;
 private httpresponecallback mcallback = null;

 //创建接口对象
 public static requestapidata getinstance() {
 if (instance == null) {
 instance = new requestapidata();
 }
 return instance;
 }

 /**
 * 4.6注册用户接口
 * @param nickname 昵称
 * @param email 邮箱
 * @param password 密码
 * @param clazz 数据返回的解析对象
 * @param callback 回调
 * 特别要注意参数位置不能变要根据文档来
 * 请求方式:post
 */
 public void getregistdata(string nickname,string email
 ,string password, class<analyticalregistinfo> clazz,
 httpresponecallback callback) {
 mcallback = callback;
 //这是每一个接口的唯一标示
 string tagurl = urlconstance.key_regist_info;//注册接口
 //将注册的信息保存在map中(须和服务器端一致)
 hashmap<string, string> parameter = new hashmap<string, string>();
 parameter.put("nickname", nickname);
 parameter.put("email",email);
 parameter.put("password",password);

 //拼接参数信息,昵称,邮箱,密码,公钥,并用md5进行加密
 stringbuilder builder = new stringbuilder();
 builder.append(nickname);
 builder.append(email);
 builder.append(password);
 builder.append(urlconstance.public_key);

 parameter.put(urlconstance.accesstoken_key,md5util.getmd5str(builder.tostring()));

 //调用requestmanager的post方法,请求服务器
 requestmanager.post(urlconstance.app_url,tagurl, parameter, clazz, callback);

 }
}

        4.网络请求处理的类(requestmanager)

[Java] 查看源文件 复制代码
 public class requestmanager {
 private static requestqueue mrequestqueue;
 private static imageloader mimageloader;


 private synchronized static void initrequestqueue() {
 if (mrequestqueue == null) {
 //创建一个请求队列(使用volley框架)
 mrequestqueue = volley.newrequestqueue(itlanbaolibapplication.getinstance());
 }
 }


 /**
 * 添加请求到请求队列中
 * @param request
 * @param tag
 */
 private static void addrequest(request<[0]+ … + parm[n-1] sign =
 * md5(parms+"双方平台约定公钥")
 */
 private static apiparams getpostapiparmes(final hashmap<string, string> parameter) {
 apiparams api = new apiparams();
 for (entry<string, string> entry : parameter.entryset()) {
 api.with(entry.getkey(), entry.getvalue());
 }
 return api;
 }

}

        5.在请求服务器成功/失败后会执行回调方法,而我们传入的callback对象是自身(registeractivity),所以现在我们回到注册页面

[Java] 查看源文件 复制代码
 @override
 public void onresponestart(string apiname) {
 // todo auto-generated method stub
 toast.maketext(registeractivity.this, "正在请求数据...", toast.length_short).show();
 }

 @override
 public void onloading(string apiname, long count, long current) {
 toast.maketext(registeractivity.this, "loading...", toast.length_short).show(); 
 }

 @override
 public void onsuccess(string apiname, object object) {
 // todo auto-generated method stub
 //注册接口
 if (urlconstance.key_regist_info.equals(apiname)) {
 if (object != null && object instanceof analyticalregistinfo) {
 analyticalregistinfo info = (analyticalregistinfo) object;
 string successcode = info.getret();
 //请求成功
 if (successcode.equals(constant.key_success)) {
  userbaseinfo baseuser = new userbaseinfo();
  baseuser.setemail(info.getemail());
  baseuser.setnickname(info.getnickname());
  baseuser.setuserhead(info.getuserhead());
  baseuser.setuserid(string.valueof(info.getuserid()));
  itlanbaoapplication.getinstance().setbaseuser(baseuser);
  userpreference.save(keyconstance.is_user_id, string.valueof(info.getuserid()));
  userpreference.save(keyconstance.is_user_account, info.getemail());
  userpreference.save(keyconstance.is_user_password, password.gettext().tostring());


  intent intent = new intent(registeractivity.this, mainactivity.class);
  registeractivity.this.startactivity(intent);

  toast.maketext(registeractivity.this, "注册成功...", toast.length_short).show();

  registeractivity.this.finish();

 } else {
  toast.maketext(registeractivity.this, "注册失败", toast.length_short).show();
 }
 }
 }

 }

 @override
 public void onfailure(string apiname, throwable t, int errorno, string strmsg) {
 toast.maketext(registeractivity.this, "failure", toast.length_short).show();
 } 

        demo下载地址:http://xiazai.jb51.net/201611/yuanma/androidlogindemo(jb51.net).rar


0

主题

9859

帖子

1695

安币

Android大神

IT

Rank: 6Rank: 6

发表于 2017-12-28 18:59:35 | 显示全部楼层
感谢分享,楼主V5~

28

主题

1万

帖子

1369

安币

Android大神

小白

Rank: 6Rank: 6

发表于 2017-12-30 09:39:22 | 显示全部楼层
感谢分享,楼主V5~

20

主题

9285

帖子

2343

安币

Android大神

Rank: 6Rank: 6

发表于 2017-12-31 16:08:00 | 显示全部楼层
帮帮顶顶!!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

领先的中文移动开发者社区
18620764416
7*24全天服务
意见反馈:1294855032@qq.com

扫一扫关注我们

Powered by Discuz! X3.2© 2001-2019 Comsenz Inc.( 粤ICP备15117877号 )