APP架子遷移實(shí)戰(zhàn)(三)

在完成上一篇之后,斷斷續(xù)續(xù)的開始重構(gòu)我的Android項(xiàng)目代碼枪芒,現(xiàn)在終于完成了彻况。在重構(gòu)期間又仔細(xì)閱讀了一些開源項(xiàng)目的源碼及文章,并詢問了一些大神思路舅踪,按照理解自己完成了MVP結(jié)構(gòu)的重構(gòu)纽甘,與google samples項(xiàng)目的大致一致,但沒有完全照搬硫朦。本文側(cè)重一些重構(gòu)過程中思考的問題贷腕,,具體的代碼可以在Github查看咬展,本文的源碼為branch1.1泽裳,重構(gòu)前的是master,最好對比看看重構(gòu)的區(qū)別破婆。

對多重callback邏輯的思考

大量的文章都只介紹讀取一次網(wǎng)絡(luò)然后用一個監(jiān)聽接口處理訪問狀態(tài)涮总,這種是最常見的網(wǎng)絡(luò)訪問規(guī)則,如下圖所示:

用監(jiān)聽的方式獲取訪問結(jié)果

但實(shí)際生產(chǎn)環(huán)境哪里僅僅是簡單的為列表獲取數(shù)據(jù)而已祷舀,要是完成業(yè)務(wù)邏輯需要多次網(wǎng)絡(luò)訪問呢瀑梗?來看一次登錄過程烹笔,我將每一個步驟都截圖如下:

基于UMENG SDK訪問微信獲取token,成功則執(zhí)行下一步

1.基于UMENG SDK訪問微信獲取token抛丽,成功執(zhí)行下一步谤职。

基于UMENG SDK獲取用戶資料(頭像、昵稱)亿鲜,成功則執(zhí)行下一步

2.基于UMENG SDK獲取用戶資料(頭像允蜈、昵稱),成功則執(zhí)行下一步蒿柳。

將數(shù)據(jù)發(fā)送服務(wù)器進(jìn)行登錄驗(yàn)證

3.將數(shù)據(jù)發(fā)送服務(wù)器進(jìn)行登錄驗(yàn)證饶套,完成登錄業(yè)務(wù)。

說起來邏輯很簡單垒探,但是從代碼實(shí)現(xiàn)角度就不夠優(yōu)雅了妓蛮。在OnSuccess中執(zhí)行下一步動作,如果不寫在另一個方法函數(shù)中的話圾叼,那么看起來就是一層套一層的結(jié)構(gòu)蛤克,可讀性很差,我考慮的有幾種技巧來盡量提高可讀性:

1.添加充足的注釋
2.用Handler(之前我是這么做的)
3.用EventBus
4.用RxJava

在這次重構(gòu)中褐奥,我放棄了Handler的方式咖耘,如果注釋充足,Handler其實(shí)并沒有提高可讀性撬码,而且從MVP架構(gòu)的角度來思考儿倒,之前Handler的編寫并沒有將View邏輯與Presenter的邏輯分離,全部放在了Handler中呜笑,應(yīng)該盡量避免夫否。


放棄handler了

EventBus在重構(gòu)中也未使用,因?yàn)镋ventBus的訂閱模式更適合一個操作需要通知多個處理的情況(比如收到新消息)叫胁,否則與監(jiān)聽接口相比閱讀性凰慈。并未提升太大。

我傾向使用RxJava驼鹅,雖然準(zhǔn)備在下一次重構(gòu)中才使用微谓,但已經(jīng)閱讀了不少的文章。在注釋充足的情況下输钩,現(xiàn)在callback套callback的方式已經(jīng)能夠閱讀豺型,但不可忽略的線程安全和內(nèi)存溢出問題,可以利用RxJava很好的解決(這也是放棄handler的一個原因买乃,你真以為實(shí)際生產(chǎn)中new一個出來就可以不管了么..)感興趣的朋友可以等我的下一個branch,我會來說說我的感受姻氨。

MVP重構(gòu)要一貫堅持到底么?

在google sample的todo例子中剪验,要想從列表頁打開新建頁肴焊,需要點(diǎn)擊浮動按鈕前联,這樣一個簡單的在onClick中搞定的事情,被拆分為三部分娶眷,我認(rèn)為實(shí)際有點(diǎn)過了似嗤。看看下面的代碼:

菜單欄按鈕點(diǎn)擊事件

如果點(diǎn)擊消息列表的按鈕届宠,需要首先清除通知badage双谆,然后清除Preference的未讀數(shù)量,然后進(jìn)行頁面跳轉(zhuǎn)席揽。按照MVP架構(gòu)思路,清除通知badage應(yīng)該在View中實(shí)現(xiàn)(也就是在Activity里多一個方法)谓厘;清除未讀數(shù)量應(yīng)該在Model的Local中(也就是專門負(fù)責(zé)本地數(shù)據(jù)操作的類)幌羞;跳轉(zhuǎn)應(yīng)該在View中實(shí)現(xiàn)(Activity里面還要多寫一個方法)。

那么其實(shí)在OnClick中3行代碼搞定的時候竟稳,你要額外多謝那么多支撐框架的代碼属桦,有必要么?再看看Model層的一個例子:

在google sample的todo例子中他爸,網(wǎng)絡(luò)訪問與本地訪問分離聂宾,一條數(shù)據(jù)是從本地讀取還是從網(wǎng)絡(luò)讀取的邏輯判斷,是寫在Repository中的诊笤。如此毫無問題系谐,思路非常清晰。但如果不存在本地化的需要讨跟,可以把代碼直接寫在Repository中么纪他?(其實(shí)可以吧...反正也不影響閱讀)

重構(gòu)之后層次很干凈

todo例子中,網(wǎng)絡(luò)與本地的操作是保持一致的(基礎(chǔ)的增刪改查)晾匠,用接口來定義了方法茶袒。在實(shí)際生產(chǎn)中(比如登錄過程),本地與網(wǎng)絡(luò)的操作差別比較大凉馆,因此應(yīng)該根據(jù)實(shí)際判斷到底是否需要用接口定義方法薪寓。

todo例子中,用到了很多Ioc的思想澜共,如果你不用DI庫如dagger2或者要做單元測試向叉,可以考慮簡化一下,正如我實(shí)例化Presenter的代碼一樣咳胃。

重構(gòu)之后植康,數(shù)據(jù)的成員變量該放哪去了?

詳情頁展懈,需要一個描述商品數(shù)據(jù)的成員變量销睁;其他用戶的介紹頁供璧,需要一個描述用戶資料數(shù)據(jù)的成員變量;列表冻记,需要一個數(shù)組來保存數(shù)據(jù)睡毒,一個int來保存現(xiàn)在是第幾頁了。那么MVP結(jié)構(gòu)重構(gòu)之后冗栗,這些變量是不應(yīng)該仍然定義在Activity中的演顾,那么這些數(shù)據(jù)應(yīng)該放在MVP的那一層呢?

安裝todo例子中的介紹隅居,包含2方面的重構(gòu)钠至。首先,數(shù)據(jù)變量應(yīng)該寫在P層中胎源;其次棉钧,對ListView這種包含adapter的控件,數(shù)組操作應(yīng)該寫到Adapter中涕蚤。

Presenter的構(gòu)造器

以我一個Presenter為例宪卿,由于不考慮注入,因此Repository就直接在構(gòu)造器中自己實(shí)例化了万栅。當(dāng)前列表為第幾頁的mPage變量佑钾,是放在Presenter中了的,每次獲取數(shù)據(jù)后都直接將數(shù)據(jù)傳入View中烦粒,再在View中調(diào)用Adapter的自定義方法來更新列表(詳情見代碼)休溶。

ListView的數(shù)據(jù)操作都在Adapter中定義

在Adapter中,自定義了remove扰她、replace邮偎、addAll、getItem等幾種常用的數(shù)據(jù)操作函數(shù)义黎,不夠再加就是了禾进。自定義這些方法的時候,尤其要注意你是否自己實(shí)現(xiàn)了header-view的功能廉涕,如果實(shí)現(xiàn)了泻云,那么就要計算一下實(shí)際的位置(其實(shí)特簡單,一句話的事)狐蜕。

后話

其實(shí)本來想按照重構(gòu)后MVP長什么樣的思路來寫這文章宠纯,但是在重構(gòu)的過程中不斷的閱讀todo例子的代碼,覺得把握住幾個關(guān)鍵點(diǎn)层释,重構(gòu)的思路就會非常清晰:

1.各種數(shù)據(jù)操作都要放到M層中去婆瓜;
2.V層中只需要定義方法的時候把數(shù)據(jù)設(shè)為參數(shù),不管數(shù)據(jù)從哪來,到哪去廉白;
3.P層負(fù)責(zé)告訴M層要讀哪些數(shù)據(jù)(get)或者要向服務(wù)器發(fā)送什么數(shù)據(jù)(set)个初,根據(jù)數(shù)據(jù)訪問情況(成功或失敗)猴蹂,將數(shù)據(jù)傳給V層院溺;

這一篇更多的是想把自己重構(gòu)過程中的一些思考記下來和大家一起討論,本篇不是這次重構(gòu)的終點(diǎn)磅轻,下一篇我會繼續(xù)聊如何從這一步繼續(xù)跨到RxJava函數(shù)式編程的范圍去珍逸。每一次重構(gòu)是怎么變化的,代碼也給了聋溜,思路也給了谆膳,項(xiàng)目也是應(yīng)用商店上線的產(chǎn)品(雖然沒有錢推廣用的人不多),這個系列應(yīng)該比其他文章的玩具代碼參考價值更高吧撮躁。如有感興趣的大神指點(diǎn)一二摹量,或者也在前行的朋友一起來討論下,那我也覺得深夜碼字沒有白費(fèi)了馒胆。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市凝果,隨后出現(xiàn)的幾起案子祝迂,更是在濱河造成了極大的恐慌,老刑警劉巖器净,帶你破解...
    沈念sama閱讀 219,270評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件型雳,死亡現(xiàn)場離奇詭異,居然都是意外死亡山害,警方通過查閱死者的電腦和手機(jī)纠俭,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,489評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來浪慌,“玉大人冤荆,你說我怎么就攤上這事∪ㄏ耍” “怎么了钓简?”我有些...
    開封第一講書人閱讀 165,630評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長汹想。 經(jīng)常有香客問我外邓,道長,這世上最難降的妖魔是什么古掏? 我笑而不...
    開封第一講書人閱讀 58,906評論 1 295
  • 正文 為了忘掉前任损话,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘丧枪。我一直安慰自己光涂,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,928評論 6 392
  • 文/花漫 我一把揭開白布豪诲。 她就那樣靜靜地躺著顶捷,像睡著了一般。 火紅的嫁衣襯著肌膚如雪屎篱。 梳的紋絲不亂的頭發(fā)上服赎,一...
    開封第一講書人閱讀 51,718評論 1 305
  • 那天,我揣著相機(jī)與錄音交播,去河邊找鬼重虑。 笑死,一個胖子當(dāng)著我的面吹牛秦士,可吹牛的內(nèi)容都是我干的缺厉。 我是一名探鬼主播,決...
    沈念sama閱讀 40,442評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼隧土,長吁一口氣:“原來是場噩夢啊……” “哼提针!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起曹傀,我...
    開封第一講書人閱讀 39,345評論 0 276
  • 序言:老撾萬榮一對情侶失蹤辐脖,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后皆愉,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體嗜价,經(jīng)...
    沈念sama閱讀 45,802評論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,984評論 3 337
  • 正文 我和宋清朗相戀三年幕庐,在試婚紗的時候發(fā)現(xiàn)自己被綠了久锥。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,117評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡异剥,死狀恐怖瑟由,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情冤寿,我是刑警寧澤错妖,帶...
    沈念sama閱讀 35,810評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站疚沐,受9級特大地震影響暂氯,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜亮蛔,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,462評論 3 331
  • 文/蒙蒙 一痴施、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦辣吃、人聲如沸动遭。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,011評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽厘惦。三九已至,卻和暖如春哩簿,著一層夾襖步出監(jiān)牢的瞬間宵蕉,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,139評論 1 272
  • 我被黑心中介騙來泰國打工节榜, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留羡玛,地道東北人。 一個月前我還...
    沈念sama閱讀 48,377評論 3 373
  • 正文 我出身青樓宗苍,卻偏偏與公主長得像稼稿,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子讳窟,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,060評論 2 355

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,182評論 25 707
  • Android App的設(shè)計架構(gòu):MVC,MVP,MVVM與架構(gòu)經(jīng)驗(yàn)談1. 架構(gòu)設(shè)計的目的1.1 通過設(shè)計使程序模...
    天空在微笑閱讀 4,148評論 1 20
  • 開始的開始让歼,對明天都充滿著期待,期待著在清晨太陽的照射下會發(fā)生些奇跡丽啡; 后來的后來谋右,對明天充滿了膽怯,甚至不希望明...
    李超人不會飛閱讀 284評論 0 0
  • 01 早上不到7點(diǎn),我就起床打車趕往機(jī)場盔性,或許是期待的心情打敗了周末的睡意霞丧,我整個人顯得精神抖擻。也或許是因?yàn)橐呀?jīng)...
    綿羊的生活觀閱讀 773評論 0 2
  • 每日工作冕香,端坐臺前蛹尝。以黑色屏幕為觀臺,鼠標(biāo)滑動間悉尾,點(diǎn)突那、線、面构眯、體為之舞愕难,又以紅、綠、黃猫缭、藍(lán)葱弟、紫等七彩顏色作曲調(diào),寄...
    夏z遠(yuǎn)閱讀 290評論 0 0