上篇复习了下android的mvc模式,这篇接着复习mvp模式。
1.Model:模型层,负责处理数据的加载或者存储
2.View:视图层,负责界面数据的展示,与用户进行交互
3.Presenter:桥梁,解耦Model和view层,view层需要的数据通过presenter来调用Model层来获取
对比mvc,model层和view层职责没有变,唯一的区别在于presenter和controller,但是咋一看发现这两个的作用好像也差不多,都是控制model和view来显示数据,那么区别到底在哪了??我们来将上一章的项目改造成mvp模式,从代码上来理解!!!
1.建立IMvpPresenter接口
public interface IMvpPresenter {
void getResult(String result);
}
2.建立MvpModel
public class MvpModel {
public IMvpPresenter iMvpPresenter;
public MvpModel(IMvpPresenter iMvpPresenter){
this.iMvpPresenter=iMvpPresenter;
}
public void getParm(String url,String id){
// 创建OkHttpClient.Builder对象
OkHttpClient.Builder builder = new OkHttpClient().newBuilder() ;
// 设置拦截器
builder.addInterceptor(new Interceptor() {
@Override
public okhttp3.Response intercept(Chain chain) throws IOException {
// 设置Header
Request newRequest = chain.request().newBuilder()
.removeHeader("User-Agent")
.addHeader("User-Agent","Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.84 Safari/537.36")
.build() ;
return chain.proceed(newRequest);
}
}) ;
OkHttpClient client = builder.build();
Retrofit retrofit = new Retrofit.Builder()
.client(client)
.baseUrl(url)
.addConverterFactory(GsonConverterFactory.create())
.build();
MyService service = retrofit.create(MyService.class);
service.getInfor(id).enqueue(new Callback<InforBean>() {
@Override
public void onResponse(Call<InforBean> call, Response<InforBean> response) {
InforBean inforBean = response.body();
if (inforBean.getCode().equals("200")) {
Log.e("msg", "成功");
iMvpPresenter.getResult(inforBean.getName()+":"+inforBean.getAge());
} else {
Log.e("msg", "失败");
iMvpPresenter.getResult("失败");
}
}
@Override
public void onFailure(Call<InforBean> call, Throwable t) {
t.getStackTrace();
Log.e("msg", "连接失败");
iMvpPresenter.getResult("连接失败");
}
});
}
}
3.建立MvpView
public interface MvpView {
void showData(String data);
}
4.建立MvpPresenter
public class MvpPresenter implements IMvpPresenter {
public MvpModel mvpModel;
public MvpView mvpView;
public MvpPresenter(MvpView mvpView){
this.mvpView=mvpView;
mvpModel=new MvpModel(this);
}
public void requestData(String url,String id){
mvpModel.getParm(url,id);
}
@Override
public void getResult(String result) {
mvpView.showData(result);
}
}
5.建立MvpActivity,实现的功能和上一章一样,打开app时显示id=1的数据,点击按钮显示id=2的数据(数据是随手用nodejs写服务端返回的,感兴趣的读者朋友可以去看下我前面的nodejs文章)
public class MvpActivity extends AppCompatActivity implements View.OnClickListener,MvpView{
TextView tv;
Button bt;
MvpPresenter mvpPresenter;
String url="http://xxxxxx";
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main_avtivity);
tv=(TextView) findViewById(R.id.tv);
bt=(Button)findViewById(R.id.bt);
bt.setOnClickListener(this);
mvpPresenter=new MvpPresenter(this);
initData();
}
public void initData(){
String id="1";
mvpPresenter.requestData(url,id);
}
@Override
public void showData(String data) {
tv.setText(data);
}
@Override
public void onClick(View view) {
switch (view.getId()){
case R.id.bt:
String id="2";
mvpPresenter.requestData(url,id);
break;
default:
break;
}
}
}
至此一个简单的mvp架构模式的项目就搭建完毕了,从代码上看,区别还是很大,activity成为了view层,MvpView提供了一个展示数据的方法,Model层只和presenter打交道了,完全和view层隔离!!
结语:mvc模式中,model层和view层相互持有,mvp模式中model和view层完全隔离,这是两个模式最大的区别,在实际项目中如何运用还是根据实际情况而定!!
上一篇:Android架构模式——mvc