Android開發-淺談架構(一)


寫在前面的話

嗯 聊聊架構。 這段時間一直在維護舊項目。 包括自己之前寫的新項目 越來越發現 一個架構清晰的項目往往讓人賞心悅目。不至於在一個bug丟過來之后手足無措。包括以后別人接收自己的項目 能很快上手 何樂而不為呢?

曾經的”MVC”

先從我們曾經的 “MVC” 說起, “MVC” 全名 “Model View Controller”.
即 視圖層(View), 控制層(Controller),模型層(Model).
他們之間的關系 如圖:

 

視圖層(View) 一般由 xml布局文件擔任
控制層(Controller) 一般由 activity和fragment 擔任
模型層 (Model) 一般指的是 抽離出來的接口擴展。 嘗嘗可以復用的那一部分。 你只需要把接口 在Controller 拋出。 更新 View即可。

寫到這里 我們知道android中 Controller 控制層一般有Activity(主要)和fragment 擔任。但是activity類中 常常包含一些ui 初始化 或者 網絡 第三方sdk 的初始化。這樣寫起代碼 activity類就會變得臃腫。而且不夠優雅。那么MVP就誕生了:

MVP

MVP 是從MVC 中演變過來的。即:Model(模型層) View(視圖層) Presenter(主要作為View和model交互的一個紐帶 扮演 “主持交互”的角色。處理交互邏輯。)關系如圖:

大家看這個圖 也許不是很清楚或者說不是太理解。
在這里 “View” 由presenter中的接口擔任 實現向View實現類通信,你也可以在Android組件中實現它。有時最好直接使用Activity,Fragment或自定義View。>The view that receives commands from a presenter in MVP, is referred to as “view”

先說Model: 它是一個負責管理數據的接口。模型的職責包括使用API、緩存數據、管理數據庫等。該模型也可以是一個接口,與其他模塊負責這些職責的溝通。例如,如果您使用的是存儲庫模式,則該模型可能是一個存儲庫。如果您使用的是干凈的建築,相反,該模型可以關聯。(翻譯過來略顯生硬 簡而言之 Model層是數據訪問層,如數據庫API或遠程服務器API)

Presenter:大家可以看到Model和View是完全沒有交互的。那么 Presenter則擔當Model與View之間的中間人。你所有的業務邏輯都屬於它。Presenter負責查詢模型和更新視圖,響應用戶交互更新模型。

先說Model: 它是一個負責管理數據的接口。模型的職責包括使用API、緩存數據、管理數據庫等。該模型也可以是一個接口,與其他模塊負責這些職責的溝通。例如,如果您使用的是存儲庫模式,則該模型可能是一個存儲庫。如果您使用的是干凈的建築,相反,該模型可以關聯。(翻譯過來略顯生硬 簡而言之 Model層是數據訪問層,如數據庫API或遠程服務器API)

Presenter:大家可以看到Model和View是完全沒有交互的。那么 Presenter則擔當Model與View之間的中間人。你所有的業務邏輯都屬於它。Presenter負責查詢模型和更新視圖,響應用戶交互更新模型。

View:The view can be implemented by Activities, Fragments, any Android widget or anything that can do operations like showing a ProgressBar, updating a TextView, populating a RecyclerView and so on.(這個翻譯起來有點尷尬 感覺大家應該都能看懂)

官方給的代碼片段說明:

在寫MVP模型之前 我們有必要搞清楚這樣幾個問題:

  1. 什么是 “View”
  2. 怎么寫Model
  3. 如何理解View 界面 等
  4. 如何寫Presenter 並且完成很好的交互 解耦

參考這篇文章 作者寫的很明白 我就不做多余的描述

 

其實網上大部分講解都是套三者之間的關系交互圖來講的。只有理解了嘗試敲幾遍就差不多會了。另外 符合項目需要的才是最好的。下面我嘗試着動手仿照 ONE 一個app將MVP模式套入其中練手(項目會不斷完善的 架構 分包開始)

先截個圖 看一下目前大致的結構。
Dagger2+RxJava+Retrofit

沒用到Presenter之前 HomeActivity中:


fragmentUtil.switchTo(OneFragment.class); radioGroup.setOnCheckedChangeListener((group1, checkedId) -> { switch (checkedId) { case R.id.home_one: fragmentUtil.switchTo(OneFragment.class); break; case R.id.home_reading: fragmentUtil.switchTo(ReadingFragment.class); break; case R.id.home_music: fragmentUtil.switchTo(MusicFragment.class); break; case R.id.home_movie: fragmentUtil.switchTo(MovieFragment.class); break; default: break; } });

 

Presenter實現 

if(presenter==null)
presenter = new MainTabPresenter(this, mBinding.radio);
presenter.switchTo();


代碼排版不是很好。
github地址Dagger2+Retrofit+RxJava
簡單的邏輯代碼交由Presenter 和Model協作實現。可能表述 和理解的不是太好 歡迎指正。Demo架構Dagger2+RxJava+Retrofit 雛形已經大致出現 后面會陸續補充一些使用的小技巧 和 第三方的插入 譬如 微信熱修復 等等吧。謝謝大家~

參考:

MVC vs. MVP vs. MVVM on Android

Android App的設計架構:MVC,MVP,MVVM與架構經驗談

官方MVP Dagger2示例

等等 分享幾個免費的api(侵刪 謝謝)
干貨Api

和風天氣

ONE一個接口

歡迎加群:
QQ 群 521039620
簡書博客地址

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM