背景:
开发的时候一般都会使用一些架构,好处就是代码逻辑清晰,提高模块之间的耦合,方便测试,维护;常见的的架构:MVC、MVP、MVVM。 可能由于MVP、MVVM的兴起,MVC在android中的应用变得越来越少了,但MVC是基础,理解好MVC才能更好的理解MVP,MVVM。因为后两种都是基于MVC发展而来的。
1.MVC概述
视图层(View):对应于xml布局文件和java代码动态view部分
控制层(Controller):MVC中Android的控制层是由Activity来承担的,Activity本来主要是作为初始化页面,展示数据的操作,但是因为XML视图功能太弱,所以Activity既要负责视图的显示又要加入控制逻辑,承担的功能过多。
模型层(Model):针对业务模型,建立的数据结构和相关的类,它主要负责网络请求,数据库处理,I/O的操作。
由于android中有个god object的存在activity,再加上android中xml布局的功能性太弱,所以activity承担了绝大部分的工作。因为activity扮演了controller和view的工作,所以controller和view不太好彻底解耦,但是在一定程度上我们还是可以解耦的。
2.MVP
⑴概述
模型(Model):负责处理数据的加载或者存储,比如从网络或本地数据库获取数据等
视图(View):负责界面数据的展示,与用户进行交互,相当于Activity
主持人(Presenter):相当于协调者,是模型与视图之间的桥梁,将模型与视图分离开来
⑵优点
•模块职责划分明显,层次清晰,接口功能清晰.
•Model层和View层分离,解耦.修改View而不影响Model.
•功能复用度高,方便.一个Presenter可以复用于多个View,而不用更改Presenter的逻辑.
•有利于测试驱动开发,以前的Android开发是难以进行单元测试.
•如果后台接口还未写好,但已知返回数据类型的情况下,完全可以写出此接口完整的功能.
⑶缺点
•MVP中接口过多.
•每一个功能,相比于MVC要多写好几个文件.
•如果某一个界面中需要请求多个服务器接口,这个界面文件中会实现很多的回调接口,导致代码繁杂.
•如果更改了数据源和请求中参数,会导致更多的代码修改.
•额外的代码复杂度及学习成本.
⑷具体案例
①创建MVP包,在里面建model、view、presenter包
![](https://img.haomeiwen.com/i21236288/5ccc25e21cf4ea17.png)
②创建接口CallBack
public interface CallBack {
void onSuccess(List<Bean.DataBean> dataBean);//成功方法 将datatBean中的数据添加到集合中
void onFail(String string);//失败方法 String类型的值
}
③创建接口View
public interface View {
void setData(List<Bean.DataBean> dataBean);//成功方法 获取datatBean中的数据
void showToast(String string);//失败方法 吐司
}
④创建Model类(用来处理耗时操作)
public class Model {
public void initData(int page, int id, final CallBack callBack) {
new Retrofit.Builder()
.baseUrl(ApiService.url_project)
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.build().create(ApiService.class)
.getData2(page, id)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<DataBean>() {
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onNext(DataBean dataBean) {
if (dataBean!= null) {
callBack.onSuccess(dataBean.getData().getDatas());
}
}
@Override
public void onError(Throwable e) {
callBack.onFail(e.getMessage());
}
@Override
public void onComplete() {
}
});
}
}
⑤创建Presenter类(用来连接V层和M层)
public class Presenter implements CallBack {
private NetView netView;
private Model model;
public Presenter(NetView netView) {
this.netView = netView;
this.model = new Model();
}
@Override
public void onSuccess(List<Bean.DataBean> dataBean) {
netView.setData(dataBean);
}
@Override
public void onFail(String string) {
netView.showToast(string);
}
public void initData(int page, int id) {
model.initData(page,id,this);//在Model类中创建initData方法
}
}
⑥在MainActivity中实现View(提供成功和失败的方法),创建presenter对象
Presenter presenter = new Presenter(this);
presenter.initData(page, id);
......
@Override
public void setData(List<Bean.DataBean> dataBean) {
list.addAll(dataBean);
adapter.notifyDataSetChanged();
}
@Override
public void showToast(String string) {
Toast.makeText(getActivity(), string, Toast.LENGTH_SHORT).show();
}
网友评论