打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
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的事情就聊到这,下文我会与大家聊下怎么重构“万能”Activity的事情,请大家期待......

欢迎大家多多交流,有误的地方多多指教。本人的联系方式在个人简介里面。

代码清爽,干净了,阅读起来精神倍儿爽,一口气阅读100行不成问题!

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
万能 Activity 重构篇(Android)
android开发我的新浪微博客户端-登录页面功能篇(4.2)
Android开源测试框架学习
极光 IM 构建聊天功能
使用MVP模式重构代码
4.3.2 BroadcastReceiver庖丁解牛
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服