国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 系統(tǒng) > Android > 正文

Android:如何編寫“萬能”的Activity

2019-12-12 03:59:01
字體:
供稿:網(wǎng)友

前言

自己android開發(fā)也有些年頭了,每每回想起作為初學(xué)者的時(shí)候自己寫的代碼,自己會(huì)有種噴自己的沖動(dòng),代碼寫的太渣了。因此想著自己要總結(jié)下以前代碼中的不合理的地方,希望能給初學(xué)者一些幫助。我希望這是一個(gè)系列的文章。

本節(jié)內(nèi)容

一個(gè)“萬能”的Activity是什么樣子,“萬能”的Activity有哪些不好的地方

開始編寫“萬能”的Activity

作為了一個(gè)初學(xué)者,有可能會(huì)有好多的朋友把Activity寫的很“萬能”,當(dāng)然沒有更好。那我就以一個(gè)登陸模塊為例子,來說說一個(gè)“萬能”的Activity是怎么產(chǎn)生的,以下代碼多為偽代碼。

編寫activity_login.xml文件,這里就簡(jiǎn)單寫下偽代碼:

 一個(gè)輸入用戶賬號(hào)的 EditText 一個(gè)輸入密碼的 EditText 一個(gè)登陸按鈕 Button

編寫LoginActivity,LoginActivity包含初始化activity_login.xml中views的功能,還包含給登陸按鈕加監(jiān)聽器的功能,下面看下關(guān)鍵的代碼片段

 public LoginActivity extends Activity{  private EditText mUserNameView, mPasswordView;  private Button mLoginView;  //該方法會(huì)被onCreate方法調(diào)用  public void initViews(){   .......   各種findViewById.....代碼   //給登陸按鈕加監(jiān)聽器   mLoginView.OnClickListener(new View.OnClickListener() {    @Override     public void onClick(View v) {    }   });  } }

現(xiàn)在的LoginActivity中的代碼是不是還很清爽,干凈。它只做與UI相關(guān)的工作。

具有驗(yàn)證功能的LoginActivity

那接著要在登陸按鈕的監(jiān)聽器方法實(shí)現(xiàn)驗(yàn)證賬號(hào),密碼是否有效的功能,繼續(xù)接著完善代碼

 mLoginView.OnClickListener(new View.OnClickListener() {   @Override   public void onClick(View v) {  String userName = mUserNameView.getText();  String password = mPasswordView.getText();   //驗(yàn)證用戶輸入的用戶名,密碼是否合法  if(!validate(userName) || !validate(password)){   告訴用戶輸入的用戶名或密碼不合法,并做一些其他的工作   }  } }); //驗(yàn)證給定的字符串是否合法,true 合法,false 不合法 private boolean validate(String str){ }

現(xiàn)在的LoginActivity已經(jīng)有業(yè)務(wù)代碼出現(xiàn)了,我們?cè)搶?shí)現(xiàn)登陸功能了。

具有登陸功能的LoginActivity

在監(jiān)聽器中增加登陸功能

 mLoginView.OnClickListener(new View.OnClickListener() {   @Override   public void onClick(View v) {  驗(yàn)證用戶輸入的用戶名,密碼是否合法代碼...  if(都合法){   //開始登陸   login(userName,password);  }  } }); //登陸方法,用偽代碼來寫下網(wǎng)絡(luò)請(qǐng)求 private void login(String userName,String password){  HttpClient.getInstance().login(userName,password,   new ResponseListener(){    public void failed(Failed failed){     做失敗相關(guān)的處理工作,比如給用戶提示     把密碼輸入框清空,還比如登陸次數(shù)限制等    }    public void success(Response response){     對(duì)數(shù)據(jù)進(jìn)行解析,跳轉(zhuǎn)到app主頁(yè)或其他界面    }   }); }

具有數(shù)據(jù)解析,存儲(chǔ)功能的LoginActivity

當(dāng)我把登陸功能做好后,這時(shí)候產(chǎn)品又提了新需求,需要在用戶登陸成功后,把用戶相關(guān)的數(shù)據(jù)返回,并保存。那沒轍只能按要求來做,但是幸運(yùn)的是需求很簡(jiǎn)單,只需要修改下登陸成功方法就ok。

 public void success(Response response){   做成功相關(guān)的處理工作  //暫且把用戶信息的類叫做UserInfo,從json中解析數(shù)據(jù),假設(shè)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信息到數(shù)據(jù)表中,假設(shè)userDatabase已經(jīng)存在  userDatabase.save(userInfo);  跳到app的主頁(yè) }

到此,登陸功能開發(fā)完畢,LoginActivity最后的代碼是這樣

 public LoginActivity extends Activity{  private EditText mUserNameView, mPasswordView;  private Button mLoginView;  public void initViews(){   .......   各種findViewById.....代碼   //給登陸按鈕加監(jiān)聽器   mLoginView.OnClickListener(new View.OnClickListener() {    @Override     public void onClick(View v) {     String userName = mUserNameView.getText();    String password = mPasswordView.getText();    //驗(yàn)證用戶輸入的密碼是否合法    if(!validate(userName) || !validate(password)){     告訴用戶輸入的用戶名或密碼不合法    } else{     //開始登陸     login(userName,password);    }   }   });  }  //登陸方法,用偽代碼來寫下網(wǎng)絡(luò)請(qǐng)求  private void login(String userName,String password){  HttpClient.getInstance().login(userName,password,   new ResponseListener(){    public void failed(Failed failed){     做失敗相關(guān)的處理工作,比如給用戶提示     把密碼輸入框清空,還比如登陸次數(shù)限制等    }    public void success(Response response){     做成功相關(guān)的處理工作     //暫且把用戶信息的類叫做UserInfo,從json中解析數(shù)據(jù),假設(shè)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信息到數(shù)據(jù)表中,假設(shè)userDatabase已經(jīng)存在     userDatabase.save(userInfo);     跳到app的主頁(yè)    }   });  }  //驗(yàn)證給定的字符串是否合法,true 合法,false 不合法  private boolean validate(String str){  } }

到此登陸模塊功能已經(jīng)開發(fā)完成,LoginActivity由開始的清爽,干凈的只關(guān)心U的代碼,變成了現(xiàn)在的“萬能”Activity,LoginActivity都做了哪些工作:

  • 處理UI
  • 處理用戶名,密碼合法性驗(yàn)證業(yè)務(wù)
  • 處理數(shù)據(jù)解析,數(shù)據(jù)存儲(chǔ)

當(dāng)然你會(huì)說現(xiàn)在的LoginActivity的代碼也就將近100行,修改起來還是很容易的,但是隨著業(yè)務(wù)的增長(zhǎng),誰能保證LoginActivity代碼不會(huì)越來越多,包含的業(yè)務(wù)代碼不會(huì)更多。LoginActivity只是"萬能"Activity的一個(gè)縮影而已。

萬能是好事情,但是得看萬能是通過什么方式實(shí)現(xiàn)的,假如是通過把好多小功能分散到各自的類中,然后萬能類通過把這些小類組合在一起的萬能是真材實(shí)料的萬能。若是通過把好多小功能全部放在一個(gè)類中使得這個(gè)類變的“萬能”了,這種“萬能”是不好的。

“萬能”Activity缺點(diǎn)

我總結(jié)下“萬能”Activity缺點(diǎn)

  • 引起"萬能"Activity的變化因素很多,所以動(dòng)不動(dòng)就得修改它,沒辦法使得由于修改引入的bug的機(jī)率降到最低。
  • 業(yè)務(wù)功能沒法復(fù)用
  • 這樣的Activity可維護(hù)性,可閱讀性都不好,耦合很高。

所以為了以后長(zhǎng)遠(yuǎn)考慮,遇到“萬能”Activity一定要大膽的重構(gòu),雖然當(dāng)前重構(gòu)需要花很多時(shí)間,但是以后是一勞永的,因此讓“萬能”Activity不在萬能,讓Activity只做與UI相關(guān)的工作就足夠了。

總結(jié)

關(guān)于“萬能”Activity的事情就聊到這,請(qǐng)看Android:“萬能”Activity重構(gòu)篇

代碼清爽,干凈了,閱讀起來精神倍兒爽,一口氣閱讀100行不成問題!

以上就是本文的全部?jī)?nèi)容,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作能帶來一定的幫助,同時(shí)也希望多多支持武林網(wǎng)!

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 融水| 普安县| 彭山县| 广西| 遵化市| 西华县| 扎赉特旗| 阿城市| 织金县| 壶关县| 铅山县| 静安区| 汶上县| 大同县| 田东县| 剑河县| 玉林市| 增城市| 淮滨县| 蓬安县| 新蔡县| 尤溪县| 牙克石市| 泽普县| 苏州市| 平果县| 边坝县| 茌平县| 岫岩| 浮梁县| 伊川县| 竹山县| 开封县| 砀山县| 宝清县| 高雄县| 敖汉旗| 黄冈市| 曲沃县| 遂平县| 嘉义市|