盒子
盒子
文章目录
  1. 前言
    1. MVP
    2. View层
    3. Model层
    4. Presenter层
    5. 效果图

Android高仿微信之mvp实现(一)

前言

为了巩固一下自己对mvp架构的理解,于是突生一个想法,用mvp架构来实现一点类似于微信的功能。所以就有了现在的标题高仿微信之mvp实现。希望自己在实现的过程中能熟练掌握mvp架构的精髓,同时我也在这写下自己在这过程中的成长与所思。该片文章为第一系列,以后会根据自己的进度来写下剩余的系列。还没接触的也可以一起来学习下,当然如有不对的欢迎来指教。

MVP

首先我来简单的解释下何为mvp

  • M就是Model ,这里主要负责的就是业务处理,数据的获取,例如数据库的读写,http的网络数据的处理。
  • V就是View ,顾名思义视图的意思,这里主要的任务就是处理各个界面ui控件的处理。
  • P就是Presenter ,控制器,这里负责的是ModelView之间的联系操作。

那么他们之间到底是如何联系在一起工作的呢?当一个界面被创建时首先调用ViewView调用Presenter中的相应操作,在Presenter中则调用了Model的数据操作方法,Presenter中获得数据时,则反过来调用View中接口传回给View层。这样就简单的实现了MVP中的合作流程。这样做的一个明显的好处就是把数据操作与主界面分离,完全隔离数据操作,使得各个功能实现模块化,降低他们之间的耦合性,只要命名合理就能迅速明白该方法的作用。下面以该项目为例。

本来想以主框架为例的,但主框架目前没有Model层,所以下面以微信中的第一个聊天微信窗口为例,用MVP来实现

View层

当我们打开微信聊天界面时,要先调用设置数据的方法所以我们可以定义一个接口,其中实现设置数据的方法:

1
2
3
public interface WXView {
void setData(List<WXItemInfo> list);
}

相信大家一看方法名就能很好理解该方法要做的操作了

Model层

既然该层是实现对数据的操作,自然我们也可以定义一个接口,实现加载数据的方法:

1
2
3
public interface WXModel {
List<WXItemInfo> initData();
}

定义完之后我们再定义一个类实现该接口,进行数据的加载;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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层

到这里是不是想到也要定义一个相关接口,以便实现相关方法,没错就是这样,实现的方法就是把ViewModel连接起来:

1
2
3
public interface WXPresent {
void loadData();
}

定义一个类实现该接口,在其中引用ViewModel

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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()

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
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://github.com/idisfkj/HightCopyWX

转载请指明出处 idisfkj博客:https://idisfkj.github.io

支持一下
赞赏是一门艺术