rxjava+retrofit+okhttp三者封装

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_24675479/article/details/79846406

基于这篇文章进行封装https://blog.csdn.net/qq_24675479/article/details/79831828

添加依赖

 compile 'com.squareup.retrofit2:retrofit:2.3.0'
    compile 'com.squareup.retrofit2:converter-gson:+'
    compile 'com.squareup.okhttp3:logging-interceptor:+'
    compile 'com.squareup.retrofit2:adapter-rxjava:+'
    compile 'io.reactivex:rxandroid:1.2.0'
    compile 'com.squareup.okhttp3:okhttp:3.9.1'

ServiceApi进行修改

public interface ServiceApi {
    @GET("is_login")//Query代表你要查询的字段名字
    Observable<Result<UserInfo>> userlogin(@Query("username") String userName, @Query("password") String password);
}

第一种写法

 RetrofitClient.getServiceApi().userlogin("测试专用", "HB654321")
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Subscriber<Result<UserInfo>>() {
                    @Override
                    public void onCompleted() {

                    }

                    @Override
                    public void onError(Throwable e) {
                       e.printStackTrace();
                    }

                    @Override
                    public void onNext(Result<UserInfo> userInfoResult) {
                        Log.e("TAG",userInfoResult.getMsg().toString());
                    }
                });

第二种写法

 RetrofitClient.getServiceApi().userlogin("测试专用", "HB654321")
                //subscribeOn().observeOn().subscribe()
                // subscribeOn().observeOn()
                .compose(RetrofitClient.<UserInfo>transformer())

                .subscribe(new BaseSubscriber<UserInfo>() {
                    @Override
                    protected void onError(String code, String message) {
                        Log.e("TAG", message);
                    }

                    @Override
                    public void onNext(UserInfo userInfo) {
                        //Log.e("TAG", userInfo.toString());
                        Toast.makeText(MainActivity.this, userInfo.toString(), Toast.LENGTH_SHORT).show();
                    }
                });

修改retrofitClient

public class RetrofitClient {
    private static final ServiceApi mServiceApi;

    static {
        OkHttpClient okHttpClient = new OkHttpClient.Builder().
                addInterceptor(new HttpLoggingInterceptor(new HttpLoggingInterceptor.Logger() {
                    @Override
                    public void log(String message) {
                        //默认是Log.d修改成Log.e
                        Log.e("Retorfit", message);
                    }
                }).setLevel(HttpLoggingInterceptor.Level.BODY)).build();
        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl("http://app.ahhuabang.com:8088/server/index.php/user/")
                // 添加解析转换工厂,Gson 解析,Xml解析,等等
                .addConverterFactory(GsonConverterFactory.create())
                //不设置默认的是okHttp
                .client(okHttpClient)
                .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
                .build();
        mServiceApi = retrofit.create(ServiceApi.class);
    }

    public static ServiceApi getServiceApi() {
        return mServiceApi;
    }

    public static <T> Observable.Transformer<Result<T>, T> transformer() {
        return new Observable.Transformer<Result<T>, T>() {
            @Override
            public Observable<T> call(Observable<Result<T>> resultObservable) {
                // resultObservable -> Observable<Result<UserInfo>> userLogin
                return resultObservable.flatMap(new Func1<Result<T>, Observable<T>>() {
                    @Override
                    public Observable<T> call(Result<T> tResult) {
                        // 解析不同的情况返回
                        if (tResult.isOk()) {
                            // 返回成功
                            return createObservable(tResult.data);
                        } else {
                            // 返回失败
                            return Observable.error(new ErrorHandle.ServiceError("", tResult.getMsg()));
                        }
                    }
                }).subscribeOn(Schedulers.io()).unsubscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread());
            }
        };
    }

    private static <T> Observable<T> createObservable(final T data) {
        return Observable.create(new Action1<Emitter<T>>() {
            @Override
            public void call(Emitter<T> tEmitter) {
                tEmitter.onNext(data);
                tEmitter.onCompleted();
            }
        }, Emitter.BackpressureMode.NONE);
    }
}

BaseSubscriber

public abstract class BaseSubscriber<T> extends Subscriber<T> {
    @Override
    public void onCompleted() {

    }

    @Override
    public void onError(Throwable e) {
        e.printStackTrace();
        if(e instanceof ErrorHandle.ServiceError){
            ErrorHandle.ServiceError serviceError = (ErrorHandle.ServiceError) e;
            onError("409",serviceError.getMessage());
        }else{
            onError("","未知错误"+e);
        }
    }

    protected abstract void onError(String code, String message);

}

ErrorHandle服务器错误

public class ErrorHandle {

    public static class ServiceError extends Throwable {
        String errorCode;

        public ServiceError(String code, String msg) {
            super(msg);
            this.errorCode = code;
        }
    }
}

猜你喜欢

转载自blog.csdn.net/qq_24675479/article/details/79846406