Android 組件化/模塊化之路——在展示層搭建MVP結構
什么是MVP
Model–View–Presenter (MVP) 源於 Model–View–Controller (MVC) 的結構設計模式,它是用於展示層(Presentation)的結構。
MVP 中的 Presenter 是 “中間人”角色,它的功能是在 Model–View–Presenter 三者中起到連接和協作的作用。程序中的大部分的邏輯都應該在 Presenter 中實現。
- Model 定義了數據的訪問接口。例如之前文章 《App 組件化/模塊化之路——Repository 模式》 就介紹了使用 Repository 實現數據訪問的一種方式。
- View 定義了展示數據的接口,以及轉發用戶的指令
- Presenter 是連接 Model 與 View 的橋梁,是它們的協作者。
接下來我們就開始搭建通用的 MVP 結構了。
Model
Model 的實現主要是根據業務,我們這里是推薦使用 Repository 來實現,可以參考文章 《App 組件化/模塊化之路——Repository 模式》 。
View
首先我們定義 View 接口,這里定義了一個請求的通用流程 onStart()
、 onFinished()
、 onError()
等方法。
public interface IView<T> { Activity getActivity(); /** * 請求開始 */ void onStart(); /** * 請求結束 */ void onFinished(); /** * 請求出錯 * @param errorCode * @param message */ void onError(int errorCode, String message); }
Presenter
先定義 IPresenter, 接口很簡單,是 Presenter 創建和注銷的過程。
public interface IPresenter { void onCreate(); void onDestroy(); }
然后定義 BasePresenter,這個是 Presenter 是各個具體業務實現的基類。
public abstract class BasePresenter<T extends IView> implements IPresenter { public static final int ERROR_RX = 2000; public T view; public BasePresenter(T view) { this.view = view; } @Override public void onCreate() { } Activity getActivity() { return view.getActivity(); } /** * 用於判斷當前view是否已經退出 * * @return */ public boolean isViewDetached() { if (view == null) { return true; } if (view.getActivity() == null) { return true; } if (view.getActivity().isFinishing()) { return true; } return false; } public String getRxErrorText() { return view.getActivity().getString(R.string.error_network); } @Override public void onDestroy() { view = null; } }
Contract
使用 Contract 模式的好處就是,如果我們的業務需求很多,那么在展示層(Presentation)中就會出現了大量的 MVP 文件。這樣對於后續維護工作是一件非常令人頭痛的事情,所以使用 Contract 來規范 View 和 Presenter 文件。這樣具體業務只要找到 Contract 文件,就可以知道這個業務的具體接口有哪些了。
其中 Contract 下面的 View 是定義具體業務的接口了。該類可以在 UI(例如Activity或Fragment)中實現它。
public interface DemoContract { interface View extends IView { void onGetDataFinished(String data); //other callbacks } interface Presenter extends IPresenter { void getData(); //other mehtods } }
那么在具體實現 Presenter 時,這里的 Repository 就是 Model了。使用它可以對數據進行訪問和存儲。
public class DemoPresenter extends BasePresenter<DemoContract.View> implements DemoContract.Presenter { DemoRepository repository; public DemoPresenter(DemoContract.View view) { super(view); } @Override public void getData() { view.onGetDataFinished(""); } }
Client
客戶端的使用基本上是在 Android View 組件。例如
public class DemoActivity extends AppCompatActivity implements DemoContract.View { DemoPresenter mPresenter; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); mPresenter = new DemoPresenter(this); mPresenter.getData();//請求數據 } @Override protected void onDestroy() { super.onDestroy(); mPresenter.onDestroy(); } @Override public Activity getActivity() { return this; } @Override public void onGetDataFinished(String data) { // 這里獲取到數據 } @Override public void onBegin() { //請求開始,可以顯示loading等操作 } @Override public void onFinished() { //請求結束,取消loading等操作 } @Override public void onError(int errorCode, String message) { //處理出錯 } }
參考文獻
https://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93presenter
https://github.com/googlesamples/android-architecture
微信關注我們,可以獲取更多