浅谈MVP

活在当下,别在怀念过去或憧憬未来中浪费掉今天的生活。因为明天越来越少,昨天越来越多!

MVP

所谓MVP(Model-View-Presenter)模式。是将APP的结构分为三层:

view - 界面逻辑层

  • 提供UI交互
  • 在presenter的控制下修改UI。
  • 将业务事件交由presenter处理

presenter - 业务逻辑层

  • 对UI的各种业务事件进行相应处理。也许是与Model层交互,也许自己进行一些计算,也许控制后台Task,Service
  • 对各种订阅事件进行响应,修改UI。
  • 临时存储页面相关数据。

model - 数据模型层

  • 从网络,数据库,文件,传感器,第三方等数据源读写数据。
  • 对外部的数据类型进行解析转换为APP内部数据交由上层处理。
  • 对数据的临时存储,管理,协调上层数据请求
3674055-73a9eba4421bf5c7.png

举例说明:实现一个粉丝列表

public interface FansCallback{

          /*
        * 搜索成功
        * */

        void onSuccess(List<GlobalUserBean> list);

        /*
        * 搜索失败
        * */

        void onFailure(int code, String msg);
    }

这个接口的作用是:当prsenter层中数据相应是,view层回调,修改当前UI或者相应数据,如果你对接口或者接口回调不是很理解,请看这篇文章
接口

接下来看看view层的代码的实现

/*
*
* 粉丝列表
*
* */
public class FansListActivity extends TCBaseActivity implements UIInterface, FansListMgr.FansCallback {


    @Bind(R.id.rv_fans)
    RecyclerView mRvFansList;
    @Bind(R.id.sw_fans)
    SwipeRefreshLayout mSwipeRefreshLayout;
    @Bind(R.id.view_tac)
    TCActivityTitle mTCActivityTitle;
    //无数据背景图
    @Bind(R.id.ll_not_data)
    LinearLayout mLlNotData;

    private FansListMgr mFansListMgr;



    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_fans_list);
        ButterKnife.bind(this);
        initView();
        initData();
    }

    @Override
    public void initData() {
        mFansListMgr = FansListMgr.getInstance();//presenter对象的实现

        mFansListMgr.setFansCallback(this);//接口回调的注入

        mFansListMgr.getFans(UserInfoMgr.getInstance().getUid());//调用presenter类当中获取粉丝数目的实现

    }

    @Override
    public void initView() {

        mRvFansList.setLayoutManager(new LinearLayoutManager(this));

        //下拉刷新
        mSwipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
           @Override
           public void onRefresh() {

               mFansListMgr.getFans(UserInfoMgr.getInstance().getUid());
           }
        });

        mTCActivityTitle.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                finish();
            }
        });

    }

    @Override
    public void onSuccess(List<GlobalUserBean> list) {
        mSwipeRefreshLayout.setRefreshing(false);
        mRvFansList.setAdapter(new FansAdapter(this,list));

        if(list.size() == 0){
            mLlNotData.setVisibility(View.VISIBLE);
        }else{
            mLlNotData.setVisibility(View.GONE);
        }
    }

    @Override
    public void onFailure(int code, String msg) {

        mLlNotData.setVisibility(View.VISIBLE);

    }
}

其中UIInterface是一个接口,主要负责view类初始化view跟初始化数据

public interface UIInterface {
    void initData();
    void initView();
}

接下来看看prsenter类是怎么实现的

public class FansListMgr {

    private final static String TAG = FansListMgr.class.getSimpleName();

/*单例模式生成presenter类*/
    private static class FansListMgrHolder{
        static FansListMgr instance = new FansListMgr();
    }
    private FansCallback mFansCallback;


    public FansListMgr() {

    }
/*接口回调的方法*/
    public void setFansCallback(@NonNull FansCallback callback){
        this.mFansCallback = callback;
    }

    /*
    *
    * 请求获取粉丝
    * */
    public void getFans(String uid){
        AppClient.ApiStores apiStores = AppClient.retrofit().create(AppClient.ApiStores.class);
        Call<ResponseJson<GlobalUserBean>> call = apiStores.requestFansList(uid,uid,"1");
        call.enqueue(new Callback<ResponseJson<GlobalUserBean>>() {
            @Override
            public void onResponse(Call<ResponseJson<GlobalUserBean>> call, Response<ResponseJson<GlobalUserBean>> response) {
                if(AppClient.checkResult(response)){

                    if(mFansCallback != null){
                        mFansCallback.onSuccess(response.body().getData().getInfo());//调用接口类当中的方法,回调view层实现的方法,进行数据交互或者打到更改UI的目的
                    }
                }
            }

            @Override
            public void onFailure(Call<ResponseJson<GlobalUserBean>> call, Throwable t) {

                if(mFansCallback != null)
                    mFansCallback.onFailure(0,"获取粉丝列表失败");
            }
        });
    }


    public static FansListMgr getInstance(){
        return FansListMgrHolder.instance;
    }



    public interface FansCallback{

          /*
        * 搜索成功
        * */

        void onSuccess(List<GlobalUserBean> list);

        /*
        * 搜索失败
        * */

        void onFailure(int code, String msg);
    }
}

我习惯把契约类这个接口卸载presenter类当中,这样做的目的是接口本来代码量不多放在presenter类当中减少接口的创建管理起来比较方便

接下来就是model层数据响应的封装在此就不一一在这里展示了

这是本人对mvp模式的简单的看法,如果有不妥的地方,望各位大牛批评指正

http://www.jianshu.com/p/3e3459d0fe25
http://blog.csdn.net/lmj623565791/article/details/46596109

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容