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估计也差不了多少
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章