前言
自己android開發也有些年頭了,每每回想起作為初學者的時候自己寫的程式碼,自己會有種噴自己的衝動,程式碼寫的太渣了。因此想著自己要總結下以前程式碼中的不合理的地方,希望能給初學者一些幫助。我希望這是一個系列的文章。
本節內容
一個“萬能”的Activity是什麼樣子,“萬能”的Activity有哪些不好的地方
開始編寫“萬能”的Activity
作為了一個初學者,有可能會有好多的朋友把Activity寫的很“萬能”,當然沒有更好。那我就以一個登陸模組為例子,來說說一個“萬能”的Activity是怎麼產生的,以下程式碼多為虛擬碼。
編寫activity_login.xml檔案,這裡就簡單寫下虛擬碼:
1 2 3 |
一個輸入使用者賬號的 EditText 一個輸入密碼的 EditText 一個登陸按鈕 Button |
編寫LoginActivity,LoginActivity包含初始化activity_login.xml中views的功能,還包含給登陸按鈕加監聽器的功能,下面看下關鍵的程式碼片段
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
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
那接著要在登陸按鈕的監聽器方法實現驗證賬號,密碼是否有效的功能,繼續接著完善程式碼
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
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
在監聽器中增加登陸功能
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
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。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
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最後的程式碼是這樣
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 |
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行不成問題!
打賞支援我寫出更多好文章,謝謝!
打賞作者
打賞支援我寫出更多好文章,謝謝!
任選一種支付方式