Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android:如何編寫“萬能”的Activity

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

編輯:關於Android編程

前言

自己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行不成問題!

以上就是本文的全部內容,希望本文的內容對大家的學習或者工作能帶來一定的幫助,同時也希望多多支持本站!

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved