关于什么是MVP,以及它的原理我就不拷贝了,这里主要写一下学习体会和总结吧!
本例是结合Retrofit请求的,可能代码不全。
大概步骤:
一,M V P三个基类
BaseModel
// 就是一个接口,啥也没有。
public interface BaseModel {
}
BaseView
// 还是一个接口,啥也没有
public interface BaseView {
}
BasePresenter
public class BasePresenter {
// 持有model层的引用
protected BaseModel model;
// 持有View层的弱引用,View层一般是Activity和Fragment。
protected WeakReference<BaseView> viewReference;
}
二,实现M、V、P
定义Model层 PageModel,在model层做网络请求,每一个网络请求定一个方法:
package com.txhl.testapp.mvp.model;
import com.txhl.testapp.bean.CreditBean;
import com.txhl.testapp.bean.Shebao;
import com.txhl.testapp.bean.User;
import com.txhl.testapp.interf.GetRequest_Interface;
import com.txhl.testapp.mvp.base.BaseModel;
import com.txhl.testapp.mvp.listener.PageListener;
import com.txhl.testapp.mvp.listener.ShebaoListener;
import com.txhl.testapp.utils.RetrofitU;
import io.reactivex.Observer;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.disposables.Disposable;
import io.reactivex.functions.Consumer;
import io.reactivex.schedulers.Schedulers;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
/**
* Created by chen.yingjie on 2019/5/28
* description
*/
public class PageModel implements BaseModel {
private GetRequest_Interface request;
public PageModel() {
request = RetrofitU.getRetrofit().create(GetRequest_Interface.class);
}
public void getCredit(final PageListener listener) {
request.getCredit()
.subscribeOn(Schedulers.io())
.doOnNext(new Consumer<CreditBean>() {
@Override
public void accept(CreditBean creditBean) throws Exception {
// 处理数据,比如操作数据库等等这些操作耗时,再次操作不会导致界面卡顿
}
})
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<CreditBean>() {
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onNext(CreditBean creditBean) {
listener.onCreditSuccess(creditBean);
}
@Override
public void onError(Throwable e) {
listener.onCreditFailed(e);
}
@Override
public void onComplete() {
}
});
}
public void getShebao(String accout, long time, String sign, String id, final ShebaoListener listener) {
request.postShebao(accout, time, sign, id)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<Shebao>() {
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onNext(Shebao shebao) {
listener.onShebaoSuccess(shebao);
}
@Override
public void onError(Throwable e) {
listener.onShebaoFailed(e);
}
@Override
public void onComplete() {
}
});
}
}
注:定义的接口方法随意,比如下载的,可以再定义onProgress(), onStart(), onComplete()等。
PageListener
public interface PageListener {
void onCreditSuccess(CreditBean creditBean);
void onCreditFailed(Throwable e);
}
ShebaoListener
public interface ShebaoListener {
void onShebaoSuccess(Shebao shebao);
void onShebaoFailed(Throwable e);
}
定义View层 PageView,这里的方法和listener对应,主要是为了接收P层传回来的M层的请求结果。
package com.txhl.testapp.mvp.view;
import com.txhl.testapp.bean.CreditBean;
import com.txhl.testapp.bean.Shebao;
import com.txhl.testapp.mvp.base.BaseView;
/**
* Created by chen.yingjie on 2019/5/28
* description
*/
public interface PageView extends BaseView {
// Credit
void onCreditSuccess(CreditBean creditBean);
void onCreditFailed(Throwable e);
// Shebao
void onShebaoSuccess(Shebao shebao);
void onShebaoFailed(Throwable e);
}
定义Persenter层 PagePresenter,它持有PageModel和BaseView的对象,作为一个中间者来完成结果的传递。
package com.txhl.testapp.mvp.presenter;
import com.txhl.testapp.bean.CreditBean;
import com.txhl.testapp.bean.Shebao;
import com.txhl.testapp.mvp.base.BasePresenter;
import com.txhl.testapp.mvp.base.BaseView;
import com.txhl.testapp.mvp.listener.PageListener;
import com.txhl.testapp.mvp.listener.ShebaoListener;
import com.txhl.testapp.mvp.model.PageModel;
import com.txhl.testapp.mvp.view.PageView;
import java.lang.ref.WeakReference;
/**
* Created by chen.yingjie on 2019/5/28
* description
*/
public class PagePresenter extends BasePresenter {
public PagePresenter(PageView creditView) {
this.model = new PageModel();
this.viewReference = new WeakReference<BaseView>(creditView);
}
public void getCredit() {
if (model != null && viewReference != null && viewReference.get() != null) {
final PageView pageView = (PageView) viewReference.get();
if (pageView == null) return;
((PageModel)model).getCredit(new PageListener() {
@Override
public void onCreditSuccess(CreditBean creditBean) {
pageView.onCreditSuccess(creditBean);
}
@Override
public void onCreditFailed(Throwable e) {
pageView.onCreditFailed(e);
}
});
}
}
public void getShebao(String accout, long time, String sign, String id) {
if (model != null && viewReference != null && viewReference.get() != null) {
final PageView shebaoView = (PageView)viewReference.get();
if (shebaoView == null) return;
((PageModel)model).getShebao(accout, time, sign, id, new ShebaoListener() {
@Override
public void onShebaoSuccess(Shebao shebao) {
shebaoView.onShebaoSuccess(shebao);
}
@Override
public void onShebaoFailed(Throwable e) {
shebaoView.onShebaoFailed(e);
}
});
}
}
}
三,Activity实现View层
这里通过Persenter对象调用Model请求网络,实现View层接口来拿到结果。
package com.txhl.testapp.mvp.view.activity;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import com.txhl.testapp.R;
import com.txhl.testapp.bean.CreditBean;
import com.txhl.testapp.bean.Shebao;
import com.txhl.testapp.mvp.presenter.PagePresenter;
import com.txhl.testapp.mvp.view.PageView;
import butterknife.BindView;
import butterknife.ButterKnife;
import butterknife.OnClick;
public class PageActivity extends AppCompatActivity implements PageView {
@BindView(R.id.tvContent)
TextView tvContent;
@BindView(R.id.btnLoad)
Button btnLoad;
@BindView(R.id.btnShebao)
Button btnShebao;
private PagePresenter mPresenter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_test);
ButterKnife.bind(this);
mPresenter = new PagePresenter(this);
}
@Override
public void onCreditSuccess(CreditBean creditBean) {
tvContent.setText(creditBean.toString());
}
@Override
public void onCreditFailed(Throwable e) {
}
@Override
protected void onDestroy() {
super.onDestroy();
if (mPresenter != null) mPresenter = null;
}
@OnClick({R.id.btnLoad, R.id.btnShebao})
public void onViewClicked(View view) {
switch (view.getId()) {
case R.id.btnLoad:
mPresenter.getCredit();
break;
case R.id.btnShebao:
mPresenter.getShebao("testaccount", 20180705091735L, "Uwd1qpOOrAlLjK0cJp3BQA==", "410225197309151058");
break;
}
}
@Override
public void onShebaoSuccess(Shebao shebao) {
tvContent.setText(shebao.toString());
}
@Override
public void onShebaoFailed(Throwable e) {
}
}
使用步骤:
1,定义 Model 层的 PageModel,定义单个请求方法,如:getCredit;传入一个接口参数,用来把请求结果回调给 Persenter 层;
2,定义 View 层的 PageView,来接收Persenter层通知;
3,定义 Persenter 层的 PagePresenter,持有View层和Model层对象,作用:在 Model 层完成请求之后,调用 View 层对应方法通知 View 层。
4,activity 实现 View 层接口 PageView,实现它的方法之后就可以拿到 Model 层请求结果。
总结:
activity通过Persenter对象调用Model层请求数据,Model层通过回调接口把数据给Persenter层,Persenter层通过View层接口回调结果给activity。