MVP
mvp是在mvc的基础上进行演化而来,它分离了view层和model层,中间通过presenter来进行通信,也就是说各层做各层的事情,互不干扰,最后通过中间人去传递,这样就大大的提高的代码的可读性以及维护性,但相对而言,就需要写很多的类和方法,所以说,如果项目不大,并且迭代不多的情况下,可以考虑用mvc,反之就mvp吧,当然也可以用mvvm,clean,下面开始正文
首先,通过网上查找的一些博客,我发现封装的大部分是泛型,也就是说当你传入你需要的类型,在P层传回固定的数据,V层传回的数据也就定死了,这就导致我们需要写多个P层 对于我现在所做的项目来说,有一些不必要
根据这一种封装,一个页面只能请求一个接口 ,当请求两个不一样的接口时,就有一点点小尴尬,当然,你也可以将V层的方法里的参数写成Object 类型 但是,这并没有改变你需要写多个P层 可以说是一个页面一个P层 这和我想象中的有些不太一样
在思考的过程中,我发现了java重载机制,可以运用到我的Mvp中
我的这种方法之是用于接口较少,参数类型少
好了,废话不多说 代码如下
请求接口 可以发现利用了重载,P层和M层也会用到重载
public interface MyUrlService {
@POST
Observable postRequest(@Url String url, @QueryMap Map map);
@Multipart
@POST
Observable postRequest(@Url String url,@Part MultipartBody.Part file);
@GET
Observable getRequest(@Url String url, @QueryMap Map map);
@GET
Observable getRequest(@Url String url);
}
根据请求方式来划分,将可能用到的参数都写进去
public interface Contract {
public interface IView{
public void setData(Object data);
}
public interface IModel{
//get请求方式
public void getHttp(String url, Map map,int flag, RetrofitHttpUtil.RetrofitBack back);
//post请求方式
public void postHttp(String url, Map map,MultipartBody.Part part,int flag, RetrofitHttpUtil.RetrofitBack back);
}
public interface IPresenter{
public void onAttch(IView iView);
//get请求
public void getHttp(String url, Map map,int flag,Class> mclass);
//post请求
public void postHttp(String url, Map map, MultipartBody.Part part, int flag, Class> mclass);
public void unAttch();
}
}
这里你会发现,我们在P层传了一个Class> 类型参数 也就是你要解析的Bean类的class ,这样,一个请求方式就可以请求你所相对应的方式的所有接口
P层的父类
public abstract class BasePrsenter implements Contract.IPresenter {
private Contract.IView iView;
private BaseModel iModel;
public abstract void getMethod(String url,Class> mclass);
public abstract void getMethod(String url, Map map,Class> mclass);
public abstract void postMethod(String url, Map map,Class> mclass);
public abstract void postMethod(String url, MultipartBody.Part part, Class> mclass);
@Override
public void onAttch(Contract.IView iView) {
this.iView=iView;
iModel=new ModelImpl();
}
@Override
public void getHttp(String url, Map map, int flag, final Class> mclass) {
RetrofitHttpUtil.RetrofitBack retrofitBack = new RetrofitHttpUtil.RetrofitBack() {
@Override
public void success(String success) {
Gson gson=new Gson();
Object o = gson.fromJson(success, mclass);
iView.setData(o);
}
@Override
public void error(String error) {
Log.e("tag",error);
}
};
switch (flag) {
case 1:
iModel.getMethod(url,retrofitBack);
break;
case 2:
iModel.getMethod(url,map,retrofitBack);
break;
}
}
@Override
public void postHttp(String url, Map map, MultipartBody.Part part, int flag, final Class> mclass) {
RetrofitHttpUtil.RetrofitBack retrofitBack = new RetrofitHttpUtil.RetrofitBack() {
@Override
public void success(String success) {
Gson gson=new Gson();
Object o = gson.fromJson(success, mclass);
iView.setData(o);
}
@Override
public void error(String error) {
Log.e("tag",error);
}
};
switch (flag) {
case 1:
iModel.postMethod(url,map,retrofitBack);
break;
case 2:
iModel.postMethod(url,part,retrofitBack);
break;
}
}
@Override
public void unAttch() {
iView=null;
iModel=null;
}
}
P层的子类
public class PrsenterImpl extends BasePrsenter {
@Override
public void getMethod(String url, Class> mclass) {
getHttp(url,null,1,mclass);
}
@Override
public void getMethod(String url, Map map, Class> mclass) {
getHttp(url,map,2,mclass);
}
@Override
public void postMethod(String url, Map map, Class> mclass) {
postHttp(url,map,null,1,mclass);
}
@Override
public void postMethod(String url, MultipartBody.Part part, Class> mclass) {
postHttp(url,null,part,2,mclass);
}
}
这里我认为我充分了利用了我所认识的重载,在V层调用P层时,你只需要传你所需要的参数,父类会调用你所传的参数来做出相应的改变
M的父类
public abstract class BaseModel implements Contract.IModel {
private RetrofitHttpUtil util;
public abstract void getMethod(String url, RetrofitHttpUtil.RetrofitBack back);
public abstract void getMethod(String url, Map map, RetrofitHttpUtil.RetrofitBack back);
public abstract void postMethod(String url, Map map, RetrofitHttpUtil.RetrofitBack back);
public abstract void postMethod(String url,MultipartBody.Part part, RetrofitHttpUtil.RetrofitBack back);
@Override
public void getHttp(String url, Map map,int flag, RetrofitHttpUtil.RetrofitBack back) {
getRxHttp();
util.getHttpInfo(url,map,flag,back);
}
@Override
public void postHttp(String url, Map map, MultipartBody.Part part, int flag, RetrofitHttpUtil.RetrofitBack back) {
getRxHttp();
util.postHttpInfo(url,map,part,flag,back);
}
private void getRxHttp() {
if (util==null){
util=RetrofitHttpUtil.getInstance();
}
}
}
M的子类
public class ModelImpl extends BaseModel {
@Override
public void getMethod(String url, RetrofitHttpUtil.RetrofitBack back) {
getHttp(url,null,1,back);
}
@Override
public void getMethod(String url, Map map, RetrofitHttpUtil.RetrofitBack back) {
getHttp(url,map,2,back);
}
@Override
public void postMethod(String url, Map map, RetrofitHttpUtil.RetrofitBack back) {
postHttp(url,map,null,1,back);
}
@Override
public void postMethod(String url, MultipartBody.Part part, RetrofitHttpUtil.RetrofitBack back) {
postHttp(url,null,part,2,back);
}
}
接下里工具类
public void postHttpInfo(String url, Map map, MultipartBody.Part file, int flag, final RetrofitBack callback) {
Observable request = null;
switch (flag) {
case 1:
request = rx.postRequest(url, map);
break;
case 2:
request = rx.postRequest(url, file);
break;
}
request .subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
callback.error(e.getMessage());
}
@Override
public void onNext(ResponseBody responseBody) {
try {
callback.success(responseBody.string());
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
public void getHttpInfo(String url, Map map, int flag, final RetrofitBack callback) {
Observable request = null;
switch (flag) {
case 1:
request = rx.getRequest(url);
break;
case 2:
request = rx.getRequest(url,map);
break;
}
request.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
callback.error(e.getMessage());
}
@Override
public void onNext(ResponseBody responseBody) {
try {
callback.success(responseBody.string());
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
Activity的父类
public abstract class BaseActivity extends AppCompatActivity implements Contract.IView {
public BasePrsenter prsenter;
public abstract int initLayout();
public abstract void initView();
public abstract void initData();
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(initLayout());
ButterKnife.bind(this);
prsenter = new PrsenterImpl();
prsenter.onAttch(this);
initView();
initData();
}
@Override
protected void onDestroy() {
super.onDestroy();
prsenter.unAttch();
}
}
我们只需要实现P层的子类,在Activity中调用方法即可
当一个新接口参数发生改变时,只需要像契约类中添加参数 在P层和M层的父类中改变实体方法,添加抽象方法就ok啦
这是是一个小白的思路,如果有不足之处请大家指出。
最后附上一段话
有志者,事竟成,破釜沉舟,百二秦关终属楚。
苦心人,天不负,卧薪尝胆,三千越甲可吞吴。