Android 組件化/模塊化之路——在展示層搭建MVP結構


Android 組件化/模塊化之路——在展示層搭建MVP結構

什么是MVP

Model–View–Presenter (MVP) 源於 Model–View–Controller (MVC) 的結構設計模式,它是用於展示層(Presentation)的結構。

MVP 中的 Presenter 是 “中間人”角色,它的功能是在 Model–View–Presenter 三者中起到連接和協作的作用。程序中的大部分的邏輯都應該在 Presenter 中實現。

model–view–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

微信關注我們,可以獲取更多


免責聲明!

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



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