用Mvp模式封装一个Retrofit+Rxjava网络请求

老样子,代码走起来!!!

首先需要一个Presenter的BaseActivity,之前这篇博客贴出过:

https://blog.csdn.net/Motejia/article/details/101364832

下面开始封装使用:

首先在Activity继承时候把自己写的BasePresenter继承了和Contract,VIew实现了

public class LogoActivity extends BaseActivity<LogoPresenter> implements LogoContract.View 

牢记一点,在onCreatPresenter方法里要返回一个Presneter,不然不会订阅,出来效果:

@Override
protected LogoPresenter onCreatePresenter() {
    return new LogoPresenter(this);
}

使用的时候在Activity里用:

mPresenter.方法名即可;

开始Presenter的使用:

public class LogoPresenter extends LogoContract.Presenter {  

public LogoPresenter(LogoContract.View mView) {
    this.mView = mView;
    mModel = new LogoModel();
}
@Override
public void landLogin(String cardNo, String token) {
    Subscription subscribe = mModel.tokenLogin(cardNo, token)
            .subscribe(new Subscriber<String>() {

                @Override
                public void onStart() {
                    mView.showDialog();
                }

                @Override
                public void onCompleted() {
                    mView.hideDialog();
                }

                @Override
                public void onError(Throwable e) {
                    Log.e(TAG, e.getMessage());
                    onCompleted();
                }

                @Override
                public void onNext(String s) {
                    Log.e(TAG, s);
                }
            });
    addSubscribe(subscribe);
}
}

下面是Contrat部分:

public interface LogoContract {

//请求成功或者失败的回调一些方法

interface View extends BaseView {

    void showDialog();

    void hideDialog();

    void toLandingSuccess(NewUserInfoBean.BodyBean bodyBean);
}

//Model层

interface Model extends BaseModel {

    Observable<String> landLogin(
            String cardNo,
            String password,
    );

}

//Presenter

abstract class Presenter extends BasePresenter<LogoContract.View, LogoContract.Model> {
    public abstract void landLogin(
            String cardNo,
            String token

    );

}

}

//Model接口

public class LogoModel implements LogoContract.Model {
@Override
public Observable<String> landLogin(String cardNo, String password, String vCode, String appId) {
    return ApiEngine.getInstance().getRsApiService()
            .getAppLogin(cardNo, password)
            .compose(RxSchedulers.<String>switchThread());
}

}

//封装一个单例模式的ApiEgine类:

    private ApiEngine() {

        //日志拦截器
//        HttpLoggingInterceptor loggingInterceptor = new HttpLoggingInterceptor();
        //设置查看类别
//        loggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
        LoggingInterceptor loggingInterceptor = new LoggingInterceptor();
        //设置缓存位置与缓存的大小
        int size = 1024 * 1024 * 100;
        File cacheFile = new File(App.getContext().getCacheDir(), "okHttpCache");
        Cache cache = new Cache(cacheFile, size);


        //添加日志拦截器,并且添加网络缓存,响应时间改为了30s
        OkHttpClient client = new OkHttpClient.Builder()
                .connectTimeout(30, TimeUnit.SECONDS)
                .writeTimeout(30, TimeUnit.SECONDS)
                .readTimeout(30, TimeUnit.SECONDS)
                .addNetworkInterceptor(new NetWorkInterceptor())
                .addInterceptor(loggingInterceptor)
                .addInterceptor(new UrlPahtIntercepter())
                .cache(cache)
                .build();

        rsRetrofit = new Retrofit.Builder()
                .baseUrl("接口前缀")
                .client(client)

                .addConverterFactory(ScalarsConverterFactory.create())
                .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
                .build();

}

//将网络请求对象封装为单例模式
public static ApiEngine getInstance() {
    if (apiEngine == null) {
        synchronized (ApiEngine.class) {
            if (apiEngine == null) {
                apiEngine = new ApiEngine();
            }
        }
    }
    return apiEngine;
}

//创建Retrofit

public ApiService getRsApiService() {

    return rsRetrofit.create(ApiService.class);
}

//在创建一个ApiService类用来写接口,Retrofit注解自己看吧,不做解释

@FormUrlEncoded
@POST("接口地址")
Observable<String> getAppLogin(
        @Field("cardNo") String cardNo,
        @Field("password") String password,
      
);

 

拷贝可用,使用至上!!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章