關於什麼是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。