Retrofit+Rxjava+MVP网络请求框架

版权声明:本文为Aile原创,若需转载请标明出处 https://blog.csdn.net/ware00/article/details/82760779

导言:
之前有套基于MVP的网络请求框架,是okhttp封装的,后来由于retrofit,rxJava的流行,所以更改一部分来使用

释义:
retrofit:基于okhttp再次封装的网络请求框架
rxjava:异步工具库,handler+thread->asyctask->rxjava->rxandroid
mvp:相对于mvc的框架模式

步骤:
1:导包

    implementation 'com.squareup.retrofit2:retrofit:2.3.0'
    implementation 'com.squareup.okhttp3:logging-interceptor:3.9.1'
    implementation 'com.squareup.retrofit2:converter-gson:2.3.0'
    implementation 'com.squareup.retrofit2:adapter-rxjava2:2.3.0'
    implementation 'io.reactivex.rxjava2:rxandroid:2.0.2'
    implementation 'io.reactivex.rxjava2:rxjava:2.1.11'

2:回调接口

public interface PresenterCallback<M> {

    void getDataSuccess(M model);

    void getDataFail(String msg);
}

3:Model数据层

public class LoginBean {
    public ContentBean content;
    public Hints hints;

    public static class ContentBean {
        public String identity;
        public String nickname;
        public String avatar;
        public int enumers;
        public Object token;
        public String loginame;
        public String organ;
        public String openId;
        public String msgcode;
    }

    public static class Hints {
        public String status;
        public Hints.Tip tips;

        public static class Tip {
            public List<Hints.Tip.Detail> details;

            public static class Detail {
                public String code;
                public List<String> args;

            }
        }
    }
}

4:presenter层,逻辑控制层

public class Presenter<M> {
    public Retrofit mRetrofit;
    public PresenterCallback presenterCallback;
    public RetrofitUrl retrofitUrl;
    public CompositeDisposable mCompositeDisposable;

    public Presenter(PresenterCallback presenterCallback) {
        this.presenterCallback = presenterCallback;
        retrofitUrl = retrofit().create(RetrofitUrl.class);
    }

    //取消rxjava
    public void disposeRx() {
        this.presenterCallback = null;
        if (mCompositeDisposable != null) {
            mCompositeDisposable.dispose();
        }
    }

    //初始化retrofit
    public Retrofit retrofit() {
        if (mRetrofit == null) {
            OkHttpClient.Builder builder = new OkHttpClient.Builder();
            if (BuildConfig.DEBUG) {
                HttpLoggingInterceptor loggingInterceptor = new HttpLoggingInterceptor();
                loggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
                builder.addInterceptor(loggingInterceptor);
            }
            OkHttpClient okHttpClient = builder.build();
            mRetrofit = new Retrofit.Builder()
                    .baseUrl(UrlContainer.HOST_URL)
                    .addConverterFactory(GsonConverterFactory.create())
                    .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
                    .client(okHttpClient)
                    .build();
        }
        return mRetrofit;
    }

    //初始化rxJava
    public void addSubscription(Observable observable, DisposableObserver observer) {
        if (mCompositeDisposable == null) {
            mCompositeDisposable = new CompositeDisposable();
        }
        mCompositeDisposable.add(observer);
        observable.subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribeWith(observer);
    }

    //获取登录信息
    public void getLoginData(Map hashMap) {
        addSubscription(retrofitUrl.loginData(hashMap), new ObserverCallback<M>() {
            @Override
            public void onSuccess(M model) {
                presenterCallback.getDataSuccess(model);
            }

            @Override
            public void onFailure(String msg) {
                presenterCallback.getDataFail(msg);
            }

            @Override
            public void onFinish() {
            }
        });
    }

    //URL接口
    public interface RetrofitUrl {
        //登录信息
        @FormUrlEncoded
        @POST("a/login.json")
        Observable<LoginBean> loginData(@FieldMap Map<String, String> params);
    }

    //observer类
    public abstract class ObserverCallback<M> extends DisposableObserver<M> {

        public abstract void onSuccess(M model);

        public abstract void onFailure(String msg);

        public abstract void onFinish();

        @Override
        public void onError(Throwable e) {
            e.printStackTrace();
            if (e instanceof HttpException) {
                HttpException httpException = (HttpException) e;
                int code = httpException.code();
                String msg = httpException.getMessage();
                if (code == 504) {
                    msg = "网络不给力";
                }
                if (code == 502 || code == 404) {
                    msg = "服务器异常,请稍后再试";
                }
                onFailure(msg);
            } else {
                onFailure(e.getMessage());
            }
            onFinish();
        }

        @Override
        public void onNext(M model) {
            onSuccess(model);
        }

        @Override
        public void onComplete() {
            onFinish();
        }
    }
}

5:view,视图显示层

public class MainActivity extends BaseActivity implements PresenterCallback {
    @InjectView(R.id.text)
    TextView text;
    public Presenter presenter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ButterKnife.inject(this);
        presenter=new Presenter(this);
    }

    public void onClick(View view) {
        switch (view.getId()) {
            case R.id.button:
                Map<String, String> params = new HashMap<>();
                params.put("loginame", "18821203006");
                params.put("password", "123456");
                presenter.getLoginData(params);
                break;
        }
    }

    @Override
    public void getDataSuccess(Object model) {
        LoginBean loginBean= (LoginBean) model;
        text.setText("identity: " + loginBean.content.identity + "\n"
                + "nickname: " + loginBean.content.nickname + "\n"
                + "loginame: " + loginBean.content.loginame + "\n"
                + "status: " + loginBean.hints.status);
    }

    @Override
    public void getDataFail(String msg) {
         ToastUtils.showToastView(this, "请求失败", Toast.LENGTH_SHORT);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        if (presenter != null) {
            presenter.disposeRx();
        }
    }
}

本文结束,可直接使用

猜你喜欢

转载自blog.csdn.net/ware00/article/details/82760779