MVP是模型(Model)、视图(View)、主持人(Presenter)的缩写,分别代表项目中3个不同的模块。
-
模型(Model):负责处理数据的加载或者存储,比如从网络或本地数据库获取数据等;
-
视图(View):负责界面数据的展示,与用户进行交互;
-
主持人(Presenter):相当于协调者,是模型与视图之间的桥梁,将模型与视图分离开来。
如下图所示,View与Model并不直接交互,而是使用Presenter作为View与Model之间的桥梁。其中Presenter中同时持 有Viwe层以及Model层的Interface的引用,而View层持有Presenter层Interface的引用。当View层某个界面需要展 示某些数据的时候,首先会调用Presenter层的某个接口,然后Presenter层会调用Model层请求数据,当Model层数据加载成功之后会 调用Presenter层的回调方法通知Presenter层数据加载完毕,最后Presenter层再调用View层的接口将加载后的数据展示给用户。 这就是MVP模式的整个核心过程。

这样分层的好处就是大大减少了Model与View层之间的耦合度。一方面可以使得View层和Model层单独开发与测试,互不依赖。另一方面 Model层可以封装复用,可以极大的减少代码量。
View层
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/decorView"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/tv"
android:layout_width="100dp"
android:layout_height="50dp" />
</FrameLayout>
public interface ViewClusters {
/**
* 处理数据
*
* @param newsList
*/
void dealWithData(List<String> newsList);
/**
* 出错处理
*/
void error();
}
public class MainActivity extends Activity implements ViewClusters {
private TextView tv;
private PresenterClusters presenterClusters;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv = (TextView) findViewById(R.id.tv);
presenterClusters = new PresenterClustersImpl(this);
presenterClusters.loadData("//TODO URL");
}
@Override
public void dealWithData(List<String> newsList) {
// TODO do something
tv.setText(newsList.toString());
}
@Override
public void error() {
// TODO deal error
tv.setText("error");
}
}
presenter层
public interface PresenterClusters {
/**
* 加载数据
* @param url
*/
void loadData(String url);
}
public class PresenterClustersImpl implements PresenterClusters, OnLoadNewsListListener {
private ViewClusters viewClusters;
private ModelClusters modelClusters;
public PresenterClustersImpl(ViewClusters viewClusters) {
this.viewClusters = viewClusters;
this.modelClusters = new ModelClustersImpl();
}
@Override
public void loadData(String url) {
modelClusters.loadNews(url, this);
}
@Override
public void onSuccess(List<String> list) {
viewClusters.dealWithData(list);
}
@Override
public void onFailure(String msg, Exception e) {
viewClusters.error();
}
}
Model层
public interface OnLoadNewsListListener {
/**
* 数据加载成功
*
* @param list
*/
void onSuccess(List<String> list);
/**
* 数据加载失败
*
* @param msg
* @param e
*/
void onFailure(String msg, Exception e);
}
public interface ModelClusters {
/**
* 加载数据
*
* @param url
* @param l
*/
void loadNews(String url, OnLoadNewsListListener l);
}
public class ModelClustersImpl implements ModelClusters {
@Override
public void loadNews(String url, OnLoadNewsListListener l) {
// TODO 加载数据
if (true) {
l.onSuccess(new ArrayList<String>());
} else {
l.onFailure("", new Exception());
}
}
}
这只是一个简单的MVP模型。可在此基础上进行扩充,删改。




所有评论(0)