從google todo mvp示例再次學習MVP

2021-08-15 22:41:21 字數 2719 閱讀 2403

## 一、mvp簡介

!(* model: 資料層,負責與網路層和資料庫層的邏輯互動。 * view: ui層,顯示資料, 並向presenter報告使用者行為。 * presenter: 從model拿資料,應用到ui層,管理ui的狀態,響應使用者的行為。 ## 二、mvp優勢 在學習todo-mvp之前,先了解一下mvp的優勢。 * 分離了檢視邏輯和業務邏輯,降低了耦合。 * activity只處理生命週期的任務,**變得更加簡潔。 * 檢視邏輯和業務邏輯分別抽象到了view和presenter的介面中,提高**的閱讀性。 * presenter被抽象成介面,可以有多種具體的實現,所以方便進行單元測試。 * 把業務邏輯抽到presenter中去,避免後台執行緒引用著activity導致activity的資源無法被系統**從而引起記憶體洩露和oom。 ## 三、todo-mvp結構解析 ### 1.專案結構

!(!(

下面以tasks模組具體闡述上述中的實際作用關係。 **基類** public inte***ce basepresenter ` 其中`start()`方法的作用是presenter開始獲取資料並呼叫view中方法改變介面顯示,其呼叫時機是在fragment類的`onresume`方法中。

`public inte***ce baseview

`

其中`setpresenter()`方法作用是在將presenter例項傳入view中,其**呼叫時機是presenter實現類的建構函式中**。 **契約類** 與之前使用的mvp實現不同,官方的實現中加入了契約類來統一管理view與presenter的所有的介面,這種方式使得view與presenter中有哪些功能,一目了然,維護起來也方便,同時使得view與presenter一一對應,並有效地減少類的數目。
`public inte***ce taskscontract 

inte***ce presenter extends basepresenter

}`

**tasksactivity** activity 在專案中是乙個全域性的控制者,負責建立 view 以及 presenter 例項,並將二者聯絡起來。
`        tasksfragment tasksfragment =

(tasksfragment) getsupportfragmentmanager().findfragmentbyid(r.id.contentframe);

if (tasksfragment == null)

// 建立 presenter,taskspresenter是taskscontract.presenter 的實現類

// 傳入兩個引數

例項,負責資料層

是taskscontract.view的實現類,即view例項

mtaskspresenter = new taskspresenter(

`

其中,通過例項化`taskspresenter`時,傳入`tasksfragment`,使得在`taskspresenter`中擁有view例項。同時,在例項化時初始化建構函式,呼叫了`setpresenter()`方法,使得view例項中擁有了presenter例項物件,使得兩者聯絡起來。 `taskspresenter`建構函式如下所示:
`    public taskspresenter(@nonnull tasksrepository tasksrepository, @nonnull taskscontract.view tasksview) 

`

**tasksfragment** 將fragment作為view層的實現類,使得activity作為乙個全域性控制類來建立物件,而fragment作為view,兩者各司其職。同時,fragment比較靈活,能夠方便的處理介面適配的問題。
`public class tasksfragment extends fragment implements taskscontract.view 

………..

@override

public void onresume

() ………..

@override

public void setpresenter(@nonnull taskscontract.presenter presenter)

………..

@override

public boolean isactive

() ………..

}對於 view 的實現tasksfragment,只挑一部分重要的方法來看。

* `newinstance ()`方法,例項化tasksfragment物件。

* `setpresenter()`方法繼承於父類,通過該方法,view 獲得了 presenter 得例項,從而可以呼叫 presenter **來處理業務邏輯。

* 在`onresume()`中,呼叫了 presenter 得`start()`方法,獲取資料並操作view介面的顯示。

* `isactive()`方法,通過`isadded()`判斷對應activity是否銷毀。在fragment在執行非同步耗時操作後,如果呼叫activity例項,應當先使用`isactive()`方法加以判斷。

## 四、總結 通過對todo-mvp分析,再次了解學習了mvp。從google提供的例子中可以看出,mvp的實現較為簡單,model、view和presenter各個職責明確,便於擴充套件維護。contract契約類的出現,使得model和presenter結構更加清晰明了。activity和fragment的配合,使得activity職能更為簡化,同時view的實現更加靈活。

WinForm 從XML中動態載入選單的示例

這個案例是乙個基於vs2005的winform選單控制項的例子,功能是從xml中動態載入選單資料到menutrip控制項上。這個案例中用到了xml,反射之類的技術。當然實用價值有限,僅供學習參考之用。首先建立乙個winform專案,在form1上放置乙個menutrip控制項,將其命名為mainme...

從txt讀取資訊然後儲存到excel中示例

一 導包 實現這個功能需要poi的包需要將jar包匯入 org.apache.poi poi3.17 beta1 二 示例 讀取txt將資料儲存到excel param args public static void main string args if jsonobject1.containsk...

基於GIN的API介面從開發到部署 簡單示例

使用go mod 管理專案,可以更加靈活的在專案中管理對應的go包 新建專案gorestful,建立資料夾,路徑 e 1234 gorestful 進入目錄 e 1234 gorestful 裡,新建入口檔案 main.go 在 e 1234 gorestful 裡開啟終端執行命令 go mod i...