活在当下,别在怀念过去或憧憬未来中浪费掉今天的生活。因为明天越来越少,昨天越来越多!
MVP
所谓MVP(Model-View-Presenter)模式。是将APP的结构分为三层:
view - 界面逻辑层
- 提供UI交互
- 在presenter的控制下修改UI。
- 将业务事件交由presenter处理
presenter - 业务逻辑层
- 对UI的各种业务事件进行相应处理。也许是与Model层交互,也许自己进行一些计算,也许控制后台Task,Service
- 对各种订阅事件进行响应,修改UI。
- 临时存储页面相关数据。
model - 数据模型层
- 从网络,数据库,文件,传感器,第三方等数据源读写数据。
- 对外部的数据类型进行解析转换为APP内部数据交由上层处理。
- 对数据的临时存储,管理,协调上层数据请求
举例说明:实现一个粉丝列表
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