Android:如何编写“万能”的Activity
前言
自己android开发也有些年头了,每每回想起作为初学者的时候自己写的代码,自己会有种喷自己的冲动,代码写的太渣了。因此想着自己要总结下以前代码中的不合理的地方,希望能给初学者一些帮助。我希望这是一个系列的文章。
本节内容
一个“万能”的activity是什么样子,“万能”的activity有哪些不好的地方
开始编写“万能”的activity
作为了一个初学者,有可能会有好多的朋友把activity写的很“万能”,当然没有更好。那我就以一个登陆模块为例子,来说说一个“万能”的activity是怎么产生的,以下代码多为伪代码。
编写activity_login.xml文件,这里就简单写下伪代码:
一个输入用户账号的 edittext 一个输入密码的 edittext 一个登陆按钮 button
编写loginactivity,loginactivity包含初始化activity_login.xml中views的功能,还包含给登陆按钮加监听器的功能,下面看下关键的代码片段
public loginactivity extends activity{ private edittext musernameview, mpasswordview; private button mloginview; //该方法会被oncreate方法调用 public void initviews(){ ....... 各种findviewbyid.....代码 //给登陆按钮加监听器 mloginview.onclicklistener(new view.onclicklistener() { @override public void onclick(view v) { } }); } }
现在的loginactivity中的代码是不是还很清爽,干净。它只做与ui相关的工作。
具有验证功能的loginactivity
那接着要在登陆按钮的监听器方法实现验证账号,密码是否有效的功能,继续接着完善代码
mloginview.onclicklistener(new view.onclicklistener() { @override public void onclick(view v) { string username = musernameview.gettext(); string password = mpasswordview.gettext(); //验证用户输入的用户名,密码是否合法 if(!validate(username) || !validate(password)){ 告诉用户输入的用户名或密码不合法,并做一些其他的工作 } } }); //验证给定的字符串是否合法,true 合法,false 不合法 private boolean validate(string str){ }
现在的loginactivity已经有业务代码出现了,我们该实现登陆功能了。
具有登陆功能的loginactivity
在监听器中增加登陆功能
mloginview.onclicklistener(new view.onclicklistener() { @override public void onclick(view v) { 验证用户输入的用户名,密码是否合法代码... if(都合法){ //开始登陆 login(username,password); } } }); //登陆方法,用伪代码来写下网络请求 private void login(string username,string password){ httpclient.getinstance().login(username,password, new responselistener(){ public void failed(failed failed){ 做失败相关的处理工作,比如给用户提示 把密码输入框清空,还比如登陆次数限制等 } public void success(response response){ 对数据进行解析,跳转到app主页或其他界面 } }); }
具有数据解析,存储功能的loginactivity
当我把登陆功能做好后,这时候产品又提了新需求,需要在用户登陆成功后,把用户相关的数据返回,并保存。那没辙只能按要求来做,但是幸运的是需求很简单,只需要修改下登陆成功方法就ok。
public void success(response response){ 做成功相关的处理工作 //暂且把用户信息的类叫做userinfo,从json中解析数据,假设response.getcontent()存在 string jsoncontent = response.getcontent(); jsonobject jsonobject = new jsonobject(jsoncontent); userinfo userinfo = new userinfo(); userinfo.name = jsonobject.optstring("name"); userinfo.userid = jsonobject.optstring("userid"); 其他字段的解析...... //保存userinfo信息到数据表中,假设userdatabase已经存在 userdatabase.save(userinfo); 跳到app的主页 }
到此,登陆功能开发完毕,loginactivity最后的代码是这样
public loginactivity extends activity{ private edittext musernameview, mpasswordview; private button mloginview; public void initviews(){ ....... 各种findviewbyid.....代码 //给登陆按钮加监听器 mloginview.onclicklistener(new view.onclicklistener() { @override public void onclick(view v) { string username = musernameview.gettext(); string password = mpasswordview.gettext(); //验证用户输入的密码是否合法 if(!validate(username) || !validate(password)){ 告诉用户输入的用户名或密码不合法 } else{ //开始登陆 login(username,password); } } }); } //登陆方法,用伪代码来写下网络请求 private void login(string username,string password){ httpclient.getinstance().login(username,password, new responselistener(){ public void failed(failed failed){ 做失败相关的处理工作,比如给用户提示 把密码输入框清空,还比如登陆次数限制等 } public void success(response response){ 做成功相关的处理工作 //暂且把用户信息的类叫做userinfo,从json中解析数据,假设response.getcontent()存在 string jsoncontent = response.getcontent(); jsonobject jsonobject = new jsonobject(jsoncontent); userinfo userinfo = new userinfo(); userinfo.name = jsonobject.optstring("name"); userinfo.userid = jsonobject.optstring("userid"); 其他字段的解析...... //保存userinfo信息到数据表中,假设userdatabase已经存在 userdatabase.save(userinfo); 跳到app的主页 } }); } //验证给定的字符串是否合法,true 合法,false 不合法 private boolean validate(string str){ } }
到此登陆模块功能已经开发完成,loginactivity由开始的清爽,干净的只关心u的代码,变成了现在的“万能”activity,loginactivity都做了哪些工作:
- 处理ui
- 处理用户名,密码合法性验证业务
- 处理数据解析,数据存储
当然你会说现在的loginactivity的代码也就将近100行,修改起来还是很容易的,但是随着业务的增长,谁能保证loginactivity代码不会越来越多,包含的业务代码不会更多。loginactivity只是"万能"activity的一个缩影而已。
万能是好事情,但是得看万能是通过什么方式实现的,假如是通过把好多小功能分散到各自的类中,然后万能类通过把这些小类组合在一起的万能是真材实料的万能。若是通过把好多小功能全部放在一个类中使得这个类变的“万能”了,这种“万能”是不好的。
“万能”activity缺点
我总结下“万能”activity缺点
- 引起"万能"activity的变化因素很多,所以动不动就得修改它,没办法使得由于修改引入的bug的机率降到最低。
- 业务功能没法复用
- 这样的activity可维护性,可阅读性都不好,耦合很高。
所以为了以后长远考虑,遇到“万能”activity一定要大胆的重构,虽然当前重构需要花很多时间,但是以后是一劳永的,因此让“万能”activity不在万能,让activity只做与ui相关的工作就足够了。
总结
关于“万能”activity的事情就聊到这,请看android:“万能”activity重构篇
代码清爽,干净了,阅读起来精神倍儿爽,一口气阅读100行不成问题!
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持!
下一篇: MYSQL锁表问题的解决方法
推荐阅读
-
Android实现将一个Activity设置成窗口样式的方法
-
详解如何在Android中实现悬浮Activity
-
Android实现从activity中停止Service的方法
-
Android中使用Intent在Activity之间传递对象(使用Serializable或者Parcelable)的方法
-
Android如何跳转到应用商店的APP详情页面
-
如何用PHP调用自己编写的COM组件
-
Android中如何取消listview的点击效果
-
Android判断Activity是否在最上层的方法
-
[原创] 如何在android中实现shake的动作检测 - part 1 博客分类: Android AndroidHTML5咨询浏览器Flash
-
Android Activity中onStart()和onResume()的区别分析