Retrofit2.0和RxJava2.0的简单封装

一、首先添加项目依赖:

    implementation "com.squareup.okhttp3:logging-interceptor:$var.loggingInterceptor"
    implementation "com.squareup.okhttp3:okhttp:$var.okhttp"
    implementation "com.squareup.retrofit2:retrofit:$var.retrofit"
    implementation "com.google.code.gson:gson:$var.gson"
    implementation "com.squareup.retrofit2:converter-gson:$var.converterGson"
    implementation "com.squareup.retrofit2:adapter-rxjava:$var.adapterRxjava"
    implementation "io.reactivex:rxandroid:$var.rxandroid"
    implementation "io.reactivex:rxjava:$var.rxjava"
    implementation "com.squareup.retrofit2:converter-scalars:$var.converterScalars"

二、创建接口调用类

public interface APIService {

    /**
     * post方式请求网络参数
     *
     * @param token 请求参数
     * @return
     */
    @FormUrlEncoded
    @POST("AppInfo.php")
    Observable> getAppInfo(@Field("token") String token);

    @FormUrlEncoded
    @POST("FunctionList.php")
    Observable>> getFunctionList(@Field("token") String token);
}

三、封装retrofit

public class HttpMethods {

    private static final String BASE_URL = "http://xxxxxxxxxxxxxx";
    private static final long DEFAULT_TIME = 10000L;
    private Retrofit retrofit;
    private final String TAG = HttpMethods.class.getSimpleName();

    private static class SingletonHolder {
        private static final HttpMethods INSTANCE = new HttpMethods();
    }

    private HttpMethods() {
        //拦截并打印日志信息
        HttpLoggingInterceptor httpLoggingInterceptor = new HttpLoggingInterceptor(new HttpLoggingInterceptor.Logger() {
            @Override
            public void log(String message) {
                LogUtils.setTag(TAG);
                LogUtils.json(message);
            }
        }).setLevel(HttpLoggingInterceptor.Level.BODY);
        //初始化OKHttp
        OkHttpClient okHttpClient = new OkHttpClient.Builder()
                .connectTimeout(DEFAULT_TIME, TimeUnit.SECONDS)
                .readTimeout(DEFAULT_TIME, TimeUnit.SECONDS)
                .writeTimeout(DEFAULT_TIME, TimeUnit.SECONDS)
                .addInterceptor(httpLoggingInterceptor)
                .retryOnConnectionFailure(true)
                .build();
        //初始化Retrofit
        retrofit = new Retrofit.Builder()
                .baseUrl(BASE_URL)
                .client(okHttpClient)
                .addConverterFactory(ScalarsConverterFactory.create())
                .addConverterFactory(GsonConverterFactory.create())
                .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
                .build();
    }

    public static HttpMethods getInstance() {
        return SingletonHolder.INSTANCE;
    }

    public  T createService(Class clazz) {
        return retrofit.create(clazz);
    }
}

四、返回数据统一封装

public class BaseEntity implements Serializable{
    private int code;
    private String message;
    private T data;

    public int getCode() {
        return code;
    }

    public void setCode(int code) {
        this.code = code;
    }

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }

    public T getData() {
        return data;
    }

    public void setData(T data) {
        this.data = data;
    }
}

五、统一线程调度

public class DefaultTransformer<T> implements Observable.Transformer<T, T> {


    @Override
    public Observable call(Observable tObservable) {
        return tObservable.subscribeOn(Schedulers.io())
                .unsubscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .map(new Func1() {
                    @Override
                    public T call(T t) {
                        BaseEntity baseEntity = (BaseEntity) t;
                        if (baseEntity.getCode() != 200) {
                            throw new APIException(baseEntity.getCode(), baseEntity.getMessage());
                        }
                        return t;
                    }
                });
    }
    public static  DefaultTransformer create(){
        return new DefaultTransformer<>();
    }
}

六、返回错误统一处理

public abstract class APISubscriber extends Subscriber {

    private final String TAG = APISubscriber.class.getSimpleName();
    private QMUITipDialog tipDialog;

    protected APISubscriber() {

    }

    protected APISubscriber(Context context) {
        QMUITipDialog.Builder builder = new QMUITipDialog.Builder(context);
        builder.setTipWord("加载中");
        builder.setIconType(QMUITipDialog.Builder.ICON_TYPE_LOADING);
        tipDialog = builder.create();
        tipDialog.setCancelable(true);
    }

    @Override
    public void onStart() {
        super.onStart();
        if (tipDialog != null) {
            tipDialog.show();
        }
    }

    @Override
    public void onCompleted() {
        if (tipDialog != null && tipDialog.isShowing()) {
            tipDialog.dismiss();
        }
    }


    @Override
    public void onError(Throwable e) {
        if (tipDialog != null && tipDialog.isShowing())
            tipDialog.dismiss();
        if (e instanceof APIException) {
            LogUtils.e("处理服务器返回的错误");
        } else if (e instanceof ConnectException) {
            LogUtils.e("网络异常,请检查网络");
        } else if (e instanceof TimeoutException || e instanceof SocketException) {
            LogUtils.e("网络异常,请检查网络");
        } else if (e instanceof JsonSyntaxException) {
            LogUtils.e("数据解析异常");
        } else {
            LogUtils.e("服务端异常");
        }
        e.printStackTrace();
    }
}

七、使用

    /**
     * 获取APP版本信息
     *
     * @param aty
     */
    public void getAppInfo(final FunctionListAty aty) {

        final Subscription subscription = HttpMethods.getInstance()
                .createService(APIService.class)
                .getAppInfo("123")
                .compose(DefaultTransformer.>create())
                .subscribe(new APISubscriber>(aty) {
                    @Override
                    public void onNext(BaseEntity appInfoBaseEntity) {
                        AppInfo appInfo = appInfoBaseEntity.getData();
                        if (appInfo != null) {
                            Constants.DEFAULT_URL = appInfo.getApp_download_url();
                            new UpdateManager(aty, appInfo).checkUpdate();
                        }
                    }
                });
        aty.addSubscription(subscription);
    }

八、连续请求多个接口

 /**
     * 多个请求合并
     */
    public void getRequest(final FunctionListAty aty) {
        final APIService apiService = HttpMethods.getInstance().createService(APIService.class);
        Observable> appInfo = apiService.getAppInfo("123");
        Observable>> functionList = apiService.getFunctionList("123");
        final Subscription subscription = Observable.mergeDelayError(appInfo, functionList)
                .compose(DefaultTransformer.create())
                .subscribe(new APISubscriber(aty) {

                    @Override
                    public void onNext(Object o) {
                        if (o instanceof BaseEntity) {
                            BaseEntity baseEntity = (BaseEntity) o;
                            Object data = baseEntity.getData();
                            if (data != null) {
                                if (data instanceof AppInfo) {
                                    LogUtils.i("请求成功---版本信息");
                                    AppInfo appInfo = (AppInfo) data;
                                    Constants.DEFAULT_URL = appInfo.getApp_download_url();
                                    new UpdateManager(aty, appInfo).checkUpdate();
                                } else if (data instanceof List) {
                                    LogUtils.i("请求成功---列表");
                                    List functionItemList = (List) data;
                                    functionItems.addAll(functionItemList);
                                }
                            }
                        }
                    }
                });
        aty.addSubscription(subscription);
    }






你可能感兴趣的:(android)