前言
为了巩固一下自己对mvp架构的理解,于是突生一个想法,用mvp架构来实现一点类似于微信的功能。所以就有了现在的标题高仿微信之mvp实现。希望自己在实现的过程中能熟练掌握mvp架构的精髓,同时我也在这写下自己在这过程中的成长与所思。该片文章为第一系列,以后会根据自己的进度来写下剩余的系列。还没接触的也可以一起来学习下,当然如有不对的欢迎来指教。
MVP
首先我来简单的解释下何为mvp
- M就是Model ,这里主要负责的就是业务处理,数据的获取,例如数据库的读写,http的网络数据的处理。
- V就是View ,顾名思义视图的意思,这里主要的任务就是处理各个界面ui控件的处理。
- P就是Presenter ,控制器,这里负责的是Model与View之间的联系操作。
那么他们之间到底是如何联系在一起工作的呢?当一个界面被创建时首先调用View,View调用Presenter中的相应操作,在Presenter中则调用了Model的数据操作方法,Presenter中获得数据时,则反过来调用View中接口传回给View层。这样就简单的实现了MVP中的合作流程。这样做的一个明显的好处就是把数据操作与主界面分离,完全隔离数据操作,使得各个功能实现模块化,降低他们之间的耦合性,只要命名合理就能迅速明白该方法的作用。下面以该项目为例。
本来想以主框架为例的,但主框架目前没有Model层,所以下面以微信中的第一个聊天微信窗口为例,用MVP来实现
View层
当我们打开微信聊天界面时,要先调用设置数据的方法所以我们可以定义一个接口,其中实现设置数据的方法:
public interface WXView {
void setData(List<WXItemInfo> list);
}
相信大家一看方法名就能很好理解该方法要做的操作了
Model层
既然该层是实现对数据的操作,自然我们也可以定义一个接口,实现加载数据的方法:
public interface WXModel {
List<WXItemInfo> initData();
}
定义完之后我们再定义一个类实现该接口,进行数据的加载;
public class WXModleImp implements WXModel{
private List<WXItemInfo> mList;
private WXItemInfo wxItemInfo;
@Override
public List<WXItemInfo> initData() {
mList = new ArrayList<>();
for (int i = 0; i < 10; i++) {
wxItemInfo = new WXItemInfo();
wxItemInfo.setTitle("测试标题" + i);
wxItemInfo.setContent("测试内容" + i);
wxItemInfo.setTime(i + ":11");
mList.add(wxItemInfo);
}
return mList;
}
}
这里现在为了测试,所以做了假数据。现在是不是明白了一点呢?只要我们还有其他相关操作,就可以在接口中在定义一个该操作的方法,在WXModelImp中实现就可以了。
Presenter层
到这里是不是想到也要定义一个相关接口,以便实现相关方法,没错就是这样,实现的方法就是把View与Model连接起来:
public interface WXPresent {
void loadData();
}
定义一个类实现该接口,在其中引用View与Model:
public class WXPresentImp implements WXPresent{
private WXModel mWXModle;
private WXView mWXView;
private List<WXItemInfo> mList;
public WXPresentImp(WXView wxView) {
mWXView = wxView;
mWXModle = new WXModleImp();
}
@Override
public void loadData() {
mList = mWXModle.initData();
mWXView.setData(mList);
}
}
到这里基本的MVP就要结束了,最后只要在微信聊天界面实现View层的WXView接口在其中填充数据,实例化Presenter层的WXPresentImp类,调用其方法loadData();
public class WXFragment extends Fragment implements WXView{
@InjectView(R.id.wx_recyclerView)
RecyclerView wxRecyclerView;
private WXAdapter wxAdapter;
private WXPresentImp mWXPresentImp;
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = LayoutInflater.from(getContext()).inflate(R.layout.wx_layout, null);
ButterKnife.inject(this, view);
wxAdapter = new WXAdapter(getContext());
mWXPresentImp = new WXPresentImp(this);
mWXPresentImp.loadData();
wxRecyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
wxRecyclerView.addItemDecoration(new WXItemDecoration(getContext()));
wxRecyclerView.setAdapter(wxAdapter);
return view;
}
@Override
public void onDestroyView() {
super.onDestroyView();
ButterKnife.reset(this);
}
@Override
public void setData(List<WXItemInfo> list) {
wxAdapter.addData(list);
}
}
到这里整个的微信聊天的MVP就完成了,回过去再整理下思路发现是不是清楚了很多。一旦你实现了MVP就是这么简单明了,思路清晰。后面项目的工程量大了,更加需要一个很好的模式了管理项目。所以还是值得推荐的。
效果图
更多分享:https://idisfkj.github.io
项目地址:https://github.com/idisfkj/Hi...