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