基于Rxjava和Retrofit实现一个简单的MVP,简单易懂,用起来也是相当之方便

首先看下个P层的构造方法

 public Presenter(IBaseView mvpView, Class<R> clazz) {
        this.mvpView = mvpView;
        this.baseModel = new BaseModel(this);
        this.clazz = clazz;
 }

这个泛型R的用处: 就是Retrofit用到的动态代理接口,也就是你们写API的接口,我们把V层传进来,并创建了M层.

再来看看P层的实现接口

public abstract class Presenter<T, R> implements IBasepresenter<T> {
    ....
}

public interface IBasepresenter<T> {

    IBaseModel getModel();//获取modelr层

    void accessServer(Map<String, String> map, String url, int flag);//开始进行网络请求

    void accessSucceed(T body, int flag);//请求成功

    void accessError(int code, String displayMessage, int flag);//请求错误
}

当我们想进行请求的时候,我们可以调用presenter.accessServer(...)方法,看一下这个方法的实现

  @Override
    public void accessServer(Map<String, String> map, String url, int flag) {

        R request = NetWorkManager.getRetrofit().create(clazz);
        Observable<T> netObservable = getObservable(request, map, url);


        if (flag > IS_NOT_NEED_SHOW_DIALOG) {
            showProgress();
        }
        getModel().sendRequestToServer(map, url, netObservable, flag);

    }
    protected abstract Observable<T> getObservable(R request, Map<String, String> map, String url);

也是相当的简单,我们首先通过retrofit.create方法创建了Api请求类,然后调用P层的getObservable方法获取到我们RxJava的Observable.再判断是否需要展示加载条,最后通过M层进行网络请求.getObservable方法是一个抽象方法,由我们的实现类来操作.

再来看一个model层的sendRequestToServer网络请求方法

    @Override
    public <T,R> void sendRequestToServer(R request,Map<String, String> map, String url, Observable<T> netObservable, int flag) {
        Observable<T> cacheObservable = Observable.create(emitter -> {
            Log.e(TAG, "create当前线程:" + Thread.currentThread().getName());

            basePresenter.handlerFirstObservable(emitter,request);

        });

        Disposable subscribe = Observable.concat(cacheObservable, netObservable)
                .compose(ResultTransformer.handleResult())
                .compose(SchedulerProvider.getInstance().applySchedulers())
                .subscribe(t -> {
                    Log.e(TAG, "subscribe 成功:" + Thread.currentThread().getName());

                    basePresenter.accessSucceed(t, flag);

                }, throwable -> {
                    Log.e(TAG, "accept : 网络异常: \n");
                    if (throwable instanceof ApiException) {
                        basePresenter.accessError(((ApiException) throwable).getCode(), ((ApiException) throwable).getDisplayMessage(), flag);
                    }
                });
        basePresenter.addDisposable(subscribe);//把事件添加起来
    }

首先创建了一个 cacheObservable 其实这个observable可以做很多操作,比如是否用缓存,比如登陆是否要判断Token失效,比如注册成功了我们再进行登陆操作.

就是这么简单,比如我们模拟一个登陆操作,

首先创建一个LogingPresenter

public class LoginPresenter extends Presenter<LoginBean, RequestIn> {
    ILoginView mILoginView;

    public LoginPresenter(ILoginView iLoginView, Class<RequestIn> clazz) {
        super(iLoginView, clazz);
        this.mILoginView = iLoginView;

    }

    @Override
    protected Observable<LoginBean> getObservable(RequestIn request, Map<String, String> map, String url) {
        return request.logIn(map);
    }

    @Override
    protected void serverResponse(LoginBean body, int flag) {
        mILoginView.loginSuccess();
    }

    @Override
    public void showProgress() {

    }

    @Override
    public void hideProgress() {

    }
}

public interface RequestIn{

    @POST("login")
    Observable<LoginBean> logIn(@Body Map<String,String> map);
    
} 

再来看看我们是怎么使用的

    public void login(){
        Map<String,String> map = new HashMap<>();
        map.put("phone","18888888888");
        map.put("psw","123456");
        LoginPresenter presenter = new LoginPresenter(this, RequestIn.class);
        presenter.accessServer(map,"url",1);
    }

    @Override
    public void showNetworkError(int code, String displayMessage, int flag) {
        Log.e(TAG,"登陆失败");
    }

    @Override
    public void loginSuccess() {
        Log.e(TAG,"登陆成功");
    }

简简单单的几行代码就实现了我们的登陆操作.

上面也说了我们可以执行先注册,如果注册成功再登陆我们可以在P层

    @Override
    public void handlerFirstObservable(ObservableEmitter<LoginBean> emitter, RequestIn request) {
        super.handlerFirstObservable(emitter, request);
    }

实现一下这个方法.

就比如上面我们执行的是登陆接口,我们就可以在handlerFirstObservable(...)方法里执行一个注册的Api 如果注册成功了,我们就执行

 emitter.onComplete();//执行完这个之后就会执行登陆接口,很方便

例如注册失败了,我们可以执行下面代码

 emitter.onNext(null);

缓存也是一样 ,可以在这个方法里面判断是否有缓存,如果没有我们则可以将缓存添加到内存中,这个就看自己的操作,重写下面方法

    @Override
    public void hanlerDataRequestSuccess(LoginBean loginBean) {
        super.hanlerDataRequestSuccess(loginBean);
        //请求成功的数据,可以设置缓存等一些相关操作
    }

在P层我们也做了反注册代码,你们可以配合自己的BaseActivity进行封闭

    void addDisposable(Disposable s) {
        if (this.mDisposable == null) {
            this.mDisposable = new CompositeDisposable();
        }
        this.mDisposable.add(s);
    }

    public void unsubscrible() {

        if (this.mDisposable != null && mDisposable.isDisposed()) {
            this.mDisposable.dispose();
            this.mDisposable = null;
        }
    }

结束

贴上代码地址:https://github.com/fanlelong/BaseMvp

猜你喜欢

转载自blog.csdn.net/qq_35651451/article/details/81540746