GankClient(JAVA)技術淺析(四)--MVP架構

MVP架構

  • MVP架構 分離Activity的model層功能,只作爲view層,增加presenter層構建連接;
  • 一種處理視圖與數據模型關係的一種設計模式架構
  • MVC的升級版,基本上一致,把C改爲P
  • 下面自己在Android上的MVP實現方式,自己感覺理解起來比較通順.
  • 將Activity作爲controller,將導致Activity代碼臃腫,將一部分業務邏輯移除成爲Presenter層,Model層可有可無,就像之前的MVC,全擠在Activity,倒不如稱之爲MV模式,
  • 現在增加P層,M層邏輯也可在P層實現.PV模式,Acitivty主要負責視圖部分.如果業務邏輯負責,P層也會代碼爆炸.所以MVP跟MVP本質上是一致的.

Contract(契約類)

  • 統一顯示MVP各層需要對外提供調用的方法
  • 再由各層實現各自方法
public interface AndroidContract {

    interface View<T> {
          //刷新列表
          void  refreshListByData(List<T> data);
          ```
          //刷新列表失敗/網絡異常
          void showErrorView();
    }

    interface Presenter{
       //每頁行數
       void setPageRows(int page_rows);
       //刷新列表
       void refreshList();
       ```
       //銷燬處理
       void onDestroy();
    }

    interface  Model{
        Observable<GankBean> getAndroid(int page_rows, int page);
    }

}

Mode層

  • 給出Observable
public class AndroidModel implements AndroidContract.Model{

    @Override
    public Observable<GankBean> getAndroid(int page_rows,int page){
        GankServer gankServer =  RetrofitHelper.getInstance().getGankServer();
        Observable<GankBean> andriod = gankServer.getAndriod(page_rows, page);
        return andriod;
    }

}

View層

  • 這裏簡單展示刷新列表

public class AndroidFragment extends BaseListFragment<GankEntity> implements
        AndroidContract.View<GankEntity> {

    public static final String TAG="Android";
    private AndroidPresenter mPresenter;

    public AndroidFragment( ) {
        Log.d("AndroidFragment",TAG);
    }

    ```
    @Override
    protected WBaseAdapter setAdapter() {
        AndroidAdapter androidAdapter = new AndroidAdapter(null);
        return androidAdapter;
    }

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        mPresenter = new AndroidPresenter(this);
        mPresenter.setPageRows(page_rows);
        return super.onCreateView(inflater, container, savedInstanceState);
    }

    @Override
    public void onResume() {
        super.onResume();
        onRefresh();
        Log.d("AndroidFragment",TAG+"onResume");
    }

    /**
     * 刷新
     */
    @Override
    public void onRefresh() {
        super.onRefresh();
        mPresenter.refreshList();
    }
    ```
    @Override
    public void onDestroyView() {
        super.onDestroyView();
        mPresenter.onDestroy();
    }
}

Presenter層

  • 持有View 及Model層
  • 調用Model層數據請求,通過接口獲取結果
  • 根據結果調用View層的方法刷新UI
 public class AndroidPresenter implements AndroidContract.Presenter{

    private AndroidContract.View mView;
    private final AndroidContract.Model mModel;
    private ArrayList<Disposable> mDisposableList=new ArrayList<>();
    private int mPage_rows;

    public AndroidPresenter(AndroidFragment fragment) {
        this.mView = fragment;
        mModel = new AndroidModel();
    }

    /**
     * 每頁行數
     * @param page_rows
     */
    @Override
    public void setPageRows(int page_rows) {
        mPage_rows = page_rows;
    }
    /**
     * 刷新列表
     */
    @Override
    public void refreshList() {
        Observable<GankBean> android = mModel.getAndroid(mPage_rows, 1);
        android.subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Observer<GankBean>() {
                    Disposable mDisposable;
                    @Override
                    public void onSubscribe(Disposable d) {
                        mDisposableList.add(d) ;
                        mDisposable=d;
                    }

                    @Override
                    public void onNext(GankBean gankBean) {
                        if(mView!=null&&!gankBean.error)
                        {
                            mView.refreshListByData(gankBean.results);
                        }
                    }

                    @Override
                    public void onError(Throwable e) {
                        if(mView!=null )
                        {
                            mView.showErrorView();
                        }
                    }

                    @Override
                    public void onComplete() {
                        mDisposableList.remove(mDisposable);
                    }
                });
    }

   ```
    /**
     * 銷燬 等待回收
     */
    @Override
    public void onDestroy()
    {
        ```
        //清除View連接
        mView=null;
    }

}

總結

  • 在P層與M層之間可以再增加一個數據返回接口,進一步解耦
  • Android的View層通常由XML來表示,功能上稍顯不足,需要由Activity來加以輔助,處理一些監聽事件,感覺上有點大材小用了.
  • Google推出的架構Android Architecture Components(ViewModel、LiveData等),是MVVM模式,可見MVP在Android實現上並不是很好.
  • 畢竟,MVC都處理不好的,MVP估計也差不了多少
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章