APP架子遷移實戰(三)

在完成上一篇之后,斷斷續續的開始重構我的Android項目代碼,現在終于完成了。在重構期間又仔細閱讀了一些開源項目的源碼及文章,并詢問了一些大神思路,按照理解自己完成了MVP結構的重構,與google samples項目的大致一致,但沒有完全照搬。本文側重一些重構過程中思考的問題,,具體的代碼可以在Github查看,本文的源碼為branch1.1,重構前的是master,最好對比看看重構的區別。

對多重callback邏輯的思考

大量的文章都只介紹讀取一次網絡然后用一個監聽接口處理訪問狀態,這種是最常見的網絡訪問規則,如下圖所示:

用監聽的方式獲取訪問結果

但實際生產環境哪里僅僅是簡單的為列表獲取數據而已,要是完成業務邏輯需要多次網絡訪問呢?來看一次登錄過程,我將每一個步驟都截圖如下:

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

1.基于UMENG SDK訪問微信獲取token,成功執行下一步。

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

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

將數據發送服務器進行登錄驗證

3.將數據發送服務器進行登錄驗證,完成登錄業務。

說起來邏輯很簡單,但是從代碼實現角度就不夠優雅了。在OnSuccess中執行下一步動作,如果不寫在另一個方法函數中的話,那么看起來就是一層套一層的結構,可讀性很差,我考慮的有幾種技巧來盡量提高可讀性:

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

在這次重構中,我放棄了Handler的方式,如果注釋充足,Handler其實并沒有提高可讀性,而且從MVP架構的角度來思考,之前Handler的編寫并沒有將View邏輯與Presenter的邏輯分離,全部放在了Handler中,應該盡量避免。


放棄handler了

EventBus在重構中也未使用,因為EventBus的訂閱模式更適合一個操作需要通知多個處理的情況(比如收到新消息),否則與監聽接口相比閱讀性。并未提升太大。

我傾向使用RxJava,雖然準備在下一次重構中才使用,但已經閱讀了不少的文章。在注釋充足的情況下,現在callback套callback的方式已經能夠閱讀,但不可忽略的線程安全和內存溢出問題,可以利用RxJava很好的解決(這也是放棄handler的一個原因,你真以為實際生產中new一個出來就可以不管了么..)感興趣的朋友可以等我的下一個branch,我會來說說我的感受。

MVP重構要一貫堅持到底么?

在google sample的todo例子中,要想從列表頁打開新建頁,需要點擊浮動按鈕,這樣一個簡單的在onClick中搞定的事情,被拆分為三部分,我認為實際有點過了。看看下面的代碼:

菜單欄按鈕點擊事件

如果點擊消息列表的按鈕,需要首先清除通知badage,然后清除Preference的未讀數量,然后進行頁面跳轉。按照MVP架構思路,清除通知badage應該在View中實現(也就是在Activity里多一個方法);清除未讀數量應該在Model的Local中(也就是專門負責本地數據操作的類);跳轉應該在View中實現(Activity里面還要多寫一個方法)。

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

在google sample的todo例子中,網絡訪問與本地訪問分離,一條數據是從本地讀取還是從網絡讀取的邏輯判斷,是寫在Repository中的。如此毫無問題,思路非常清晰。但如果不存在本地化的需要,可以把代碼直接寫在Repository中么?(其實可以吧...反正也不影響閱讀)

重構之后層次很干凈

todo例子中,網絡與本地的操作是保持一致的(基礎的增刪改查),用接口來定義了方法。在實際生產中(比如登錄過程),本地與網絡的操作差別比較大,因此應該根據實際判斷到底是否需要用接口定義方法。

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

重構之后,數據的成員變量該放哪去了?

詳情頁,需要一個描述商品數據的成員變量;其他用戶的介紹頁,需要一個描述用戶資料數據的成員變量;列表,需要一個數組來保存數據,一個int來保存現在是第幾頁了。那么MVP結構重構之后,這些變量是不應該仍然定義在Activity中的,那么這些數據應該放在MVP的那一層呢?

安裝todo例子中的介紹,包含2方面的重構。首先,數據變量應該寫在P層中;其次,對ListView這種包含adapter的控件,數組操作應該寫到Adapter中。

Presenter的構造器

以我一個Presenter為例,由于不考慮注入,因此Repository就直接在構造器中自己實例化了。當前列表為第幾頁的mPage變量,是放在Presenter中了的,每次獲取數據后都直接將數據傳入View中,再在View中調用Adapter的自定義方法來更新列表(詳情見代碼)。

ListView的數據操作都在Adapter中定義

在Adapter中,自定義了remove、replace、addAll、getItem等幾種常用的數據操作函數,不夠再加就是了。自定義這些方法的時候,尤其要注意你是否自己實現了header-view的功能,如果實現了,那么就要計算一下實際的位置(其實特簡單,一句話的事)。

后話

其實本來想按照重構后MVP長什么樣的思路來寫這文章,但是在重構的過程中不斷的閱讀todo例子的代碼,覺得把握住幾個關鍵點,重構的思路就會非常清晰:

1.各種數據操作都要放到M層中去;
2.V層中只需要定義方法的時候把數據設為參數,不管數據從哪來,到哪去;
3.P層負責告訴M層要讀哪些數據(get)或者要向服務器發送什么數據(set),根據數據訪問情況(成功或失?。?,將數據傳給V層;

這一篇更多的是想把自己重構過程中的一些思考記下來和大家一起討論,本篇不是這次重構的終點,下一篇我會繼續聊如何從這一步繼續跨到RxJava函數式編程的范圍去。每一次重構是怎么變化的,代碼也給了,思路也給了,項目也是應用商店上線的產品(雖然沒有錢推廣用的人不多),這個系列應該比其他文章的玩具代碼參考價值更高吧。如有感興趣的大神指點一二,或者也在前行的朋友一起來討論下,那我也覺得深夜碼字沒有白費了。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,106評論 6 542
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,441評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 178,211評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,736評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,475評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,834評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,829評論 3 446
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,009評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,559評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,306評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,516評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,038評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,728評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,132評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,443評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,249評論 3 399
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,484評論 2 379

推薦閱讀更多精彩內容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,732評論 25 708
  • Android App的設計架構:MVC,MVP,MVVM與架構經驗談1. 架構設計的目的1.1 通過設計使程序模...
    天空在微笑閱讀 4,168評論 1 20
  • 開始的開始,對明天都充滿著期待,期待著在清晨太陽的照射下會發生些奇跡; 后來的后來,對明天充滿了膽怯,甚至不希望明...
    李超人不會飛閱讀 330評論 0 0
  • 01 早上不到7點,我就起床打車趕往機場,或許是期待的心情打敗了周末的睡意,我整個人顯得精神抖擻。也或許是因為已經...
    綿羊的生活觀閱讀 789評論 0 2
  • 每日工作,端坐臺前。以黑色屏幕為觀臺,鼠標滑動間,點、線、面、體為之舞,又以紅、綠、黃、藍、紫等七彩顏色作曲調,寄...
    夏z遠閱讀 297評論 0 0