Android:如何編寫“萬能”的Activity
前言
自己android開發(fā)也有些年頭了,每每回想起作為初學者的時候自己寫的代碼,自己會有種噴自己的沖動,代碼寫的太渣了。因此想著自己要總結下以前代碼中的不合理的地方,希望能給初學者一些幫助。我希望這是一個系列的文章。
本節(jié)內容
一個“萬能”的Activity是什么樣子,“萬能”的Activity有哪些不好的地方
開始編寫“萬能”的Activity
作為了一個初學者,有可能會有好多的朋友把Activity寫的很“萬能”,當然沒有更好。那我就以一個登陸模塊為例子,來說說一個“萬能”的Activity是怎么產(chǎn)生的,以下代碼多為偽代碼。
編寫activity_login.xml文件,這里就簡單寫下偽代碼:
一個輸入用戶賬號的 EditText 一個輸入密碼的 EditText 一個登陸按鈕 Button
編寫LoginActivity,LoginActivity包含初始化activity_login.xml中views的功能,還包含給登陸按鈕加監(jiān)聽器的功能,下面看下關鍵的代碼片段
public LoginActivity extends Activity{
private EditText mUserNameView, mPasswordView;
private Button mLoginView;
//該方法會被onCreate方法調用
public void initViews(){
.......
各種findViewById.....代碼
//給登陸按鈕加監(jiān)聽器
mLoginView.OnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
}
});
}
}
現(xiàn)在的LoginActivity中的代碼是不是還很清爽,干凈。它只做與UI相關的工作。
具有驗證功能的LoginActivity
那接著要在登陸按鈕的監(jiān)聽器方法實現(xiàn)驗證賬號,密碼是否有效的功能,繼續(xù)接著完善代碼
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){
}
現(xiàn)在的LoginActivity已經(jīng)有業(yè)務代碼出現(xiàn)了,我們該實現(xiàn)登陸功能了。
具有登陸功能的LoginActivity
在監(jiān)聽器中增加登陸功能
mLoginView.OnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
驗證用戶輸入的用戶名,密碼是否合法代碼...
if(都合法){
//開始登陸
login(userName,password);
}
}
});
//登陸方法,用偽代碼來寫下網(wǎng)絡請求
private void login(String userName,String password){
HttpClient.getInstance().login(userName,password,
new ResponseListener(){
public void failed(Failed failed){
做失敗相關的處理工作,比如給用戶提示
把密碼輸入框清空,還比如登陸次數(shù)限制等
}
public void success(Response response){
對數(shù)據(jù)進行解析,跳轉到app主頁或其他界面
}
});
}
具有數(shù)據(jù)解析,存儲功能的LoginActivity
當我把登陸功能做好后,這時候產(chǎn)品又提了新需求,需要在用戶登陸成功后,把用戶相關的數(shù)據(jù)返回,并保存。那沒轍只能按要求來做,但是幸運的是需求很簡單,只需要修改下登陸成功方法就ok。
public void success(Response response){
做成功相關的處理工作
//暫且把用戶信息的類叫做UserInfo,從json中解析數(shù)據(jù),假設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ù)表中,假設userDatabase已經(jīng)存在
userDatabase.save(userInfo);
跳到app的主頁
}
到此,登陸功能開發(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();
//驗證用戶輸入的密碼是否合法
if(!validate(userName) || !validate(password)){
告訴用戶輸入的用戶名或密碼不合法
} else{
//開始登陸
login(userName,password);
}
}
});
}
//登陸方法,用偽代碼來寫下網(wǎng)絡請求
private void login(String userName,String password){
HttpClient.getInstance().login(userName,password,
new ResponseListener(){
public void failed(Failed failed){
做失敗相關的處理工作,比如給用戶提示
把密碼輸入框清空,還比如登陸次數(shù)限制等
}
public void success(Response response){
做成功相關的處理工作
//暫且把用戶信息的類叫做UserInfo,從json中解析數(shù)據(jù),假設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ù)表中,假設userDatabase已經(jīng)存在
userDatabase.save(userInfo);
跳到app的主頁
}
});
}
//驗證給定的字符串是否合法,true 合法,false 不合法
private boolean validate(String str){
}
}
到此登陸模塊功能已經(jīng)開發(fā)完成,LoginActivity由開始的清爽,干凈的只關心U的代碼,變成了現(xiàn)在的“萬能”Activity,LoginActivity都做了哪些工作:
- 處理UI
- 處理用戶名,密碼合法性驗證業(yè)務
- 處理數(shù)據(jù)解析,數(shù)據(jù)存儲
當然你會說現(xiàn)在的LoginActivity的代碼也就將近100行,修改起來還是很容易的,但是隨著業(yè)務的增長,誰能保證LoginActivity代碼不會越來越多,包含的業(yè)務代碼不會更多。LoginActivity只是"萬能"Activity的一個縮影而已。
萬能是好事情,但是得看萬能是通過什么方式實現(xiàn)的,假如是通過把好多小功能分散到各自的類中,然后萬能類通過把這些小類組合在一起的萬能是真材實料的萬能。若是通過把好多小功能全部放在一個類中使得這個類變的“萬能”了,這種“萬能”是不好的。
“萬能”Activity缺點
我總結下“萬能”Activity缺點
- 引起"萬能"Activity的變化因素很多,所以動不動就得修改它,沒辦法使得由于修改引入的bug的機率降到最低。
- 業(yè)務功能沒法復用
- 這樣的Activity可維護性,可閱讀性都不好,耦合很高。
所以為了以后長遠考慮,遇到“萬能”Activity一定要大膽的重構,雖然當前重構需要花很多時間,但是以后是一勞永的,因此讓“萬能”Activity不在萬能,讓Activity只做與UI相關的工作就足夠了。
總結
關于“萬能”Activity的事情就聊到這,請看Android:“萬能”Activity重構篇
代碼清爽,干凈了,閱讀起來精神倍兒爽,一口氣閱讀100行不成問題!
以上就是本文的全部內容,希望本文的內容對大家的學習或者工作能帶來一定的幫助,同時也希望多多支持腳本之家!
- Android中fragment與activity之間的交互(兩種實現(xiàn)方式)
- Android activity堆棧及管理實例詳解
- Android實現(xiàn)Activity水平和垂直滾動條的方法
- Android開發(fā)中Activity創(chuàng)建跳轉及傳值的方法
- Android實現(xiàn)在子線程中更新Activity中UI的方法
- 詳解Android開發(fā)中Activity的四種launchMode
- Android開發(fā)中關于獲取當前Activity的一些思考
- Android判斷Activity是否在最上層的方法
- Android編程中activity啟動時出現(xiàn)白屏、黑屏問題的解決方法
- Android:“萬能”Activity重構篇
相關文章
Android RecyclerView使用GridLayoutManager間距設置的方法
本篇文章主要介紹了Android RecyclerView使用GridLayoutManager間距設置的方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-12-12
Android 動畫之TranslateAnimation應用詳解
本節(jié)講解TranslateAnimation動畫,TranslateAnimation比較常用,比如QQ,網(wǎng)易新聞菜單條的動畫,就可以用TranslateAnimation實現(xiàn),本文將詳細介紹通過TranslateAnimation 來定義動畫,需要的朋友可以參考下2012-12-12
Flutter banner_view 輪播圖的使用及實現(xiàn)代碼
這篇文章主要介紹了Flutter banner_view 輪播圖的使用及實現(xiàn)代碼,本文給大家介紹的非常詳細,具有一定的參考借鑒價值 ,需要的朋友可以參考下2019-07-07
Android AndBase框架使用封裝好的函數(shù)完成Http請求(三)
這篇文章主要介紹了Android AndBase框架使用封裝好的函數(shù)完成Http請求的相關資料,感興趣的小伙伴們可以參考一下2016-03-03

