3、RxJava2 & Retrofit2 封装实践 请求与响应的重度封装

东西不多,甚至说很少,目的并不是把网络请求封装的多么好,功能多么全,而是记录下自己的思路。希望无意中路过的同学看完之后能有些许收获!

请求前驱 HTTPServiceWrapper
响应后驱 HTTPCallbackWrapper

1、HTTPCENTER

因为HTTPServiceWrapper的出现,HTTPCENTER又要增加东西了~

    /**
     * 获取ServiceWrapper单例
     * @return
     */
    public static HTTPServiceWrapper getWrapper() {
        return ServiceWrapperHoler.serviceWrapper;
    }

    private static class ServiceWrapperHoler {
        static HTTPServiceWrapper serviceWrapper = new HTTPServiceWrapper();
    }

2、HTTPServiceWrapper

请求前驱:我乱叫的。

代码

/**
 * @author Lwang
 * @time 2017/4/26.
 */

public class HTTPServiceWrapper {
    public static HTTPService dmService = HTTPCenter.getService(HTTPCenter.SERVICE);
    public static HTTPService toyService = HTTPCenter.getService(HTTPCenter.TOYS_SERVICE);
    public void heart(HTTPCallbackWrapper<Heart,DMResponse> httpCallbackWrapper) {
        dmService.heart().map(new Function<Heart, Heart>() {
            @Override
            public Heart apply(@NonNull Heart heart) throws Exception {
                return heart;
            }
        }).compose(httpCallbackWrapper.transformer()).subscribe(httpCallbackWrapper.get());
    }

    public void toys(int offset,int limit,HTTPCallbackWrapper<TimeLineModel,TOYResponse> httpCallbackWrapper) {
        toyService.requestRecommendTimeLine(offset,limit).map(new Function<TimeLineModel, TimeLineModel>() {
            @Override
            public TimeLineModel apply(@NonNull TimeLineModel timeLineModel) throws Exception {
                /**
                 * 此处还可以取出(例如:登陆信息)另行储存
                 * token
                 * secret
                 */
                return timeLineModel;
            }
        }).compose(httpCallbackWrapper.transformer()).subscribe(httpCallbackWrapper.get());
    }
}

把请求时候需要做的琐碎的操作放在了这个包装类里,发送请求时,只需调用HTTPServiceWrapper中的方法即可。

例如:HTTPCenter.getWrapper().toys(0,20,httpCallbackWrapper);

3、HTTPCallbackWrapper 敲黑板!重点!

响应后驱 : 我乱叫的,同时也是重点!
既然是包装类,那么肯定就会有HTTPCallback,否则包装什么?

/**
 * @author Lwang
 * @time 2017/4/26.
 */

public class HTTPCallBack<T, M> {
    /**
     * 请求开始
     */
    public void onStart() {
    }

    public void onSuccess(T success) {
    }

    /**
     * 处理由服务器发起的错误
     * 401
     * 500 ...
     *
     * @param httpResponse
     */
    public void onFail(M httpResponse) {
    };

    /**
     * 处理异常
     *
     * @param e
     */
    public void onError(Throwable e) {
    };
}
HTTPCallback的泛型

HTTPCallback有两个泛型<T,M>
T为请求成功的泛型。
M为出现错误时的泛型。(为了适应多个Host的情况)

HTTPCallbackWrapper代码

/**
 * @author Lwang
 * @time 2017/4/26.
 */

public class HTTPCallbackWrapper<T, M> {
    private RxAppCompatActivity activity;
    private RxFragment fragment;
    private HTTPCallBack<T, M> callBack;
    private Class clazz;
    protected Gson gson = new Gson();

    public HTTPCallbackWrapper(RxAppCompatActivity activity, HTTPCallBack<T, M> callBack) {
        this.activity = activity;
        this.callBack = callBack;
    }

    public HTTPCallbackWrapper(RxFragment fragment, HTTPCallBack<T, M> callBack) {
        this.fragment = fragment;
        this.callBack = callBack;
    }

    public Observer get() {
        return new Observer<T>() {

            @Override
            public void onError(Throwable e) {
                try {
                    if (callBack != null && e != null) {
                        if (e instanceof HttpException) {
                            int errorCode = ((HttpException) e).response().code();
                            switch (errorCode) {
                                case 401:
                                    M response = gson.fromJson("",getClz());
                                    callBack.onFail(response);
                                    break;
                                case 500:
                                    break;
                                default:
                            }
                        } else {
                            //error
                            callBack.onError(e);
                        }
                    } else {
                        //error
                        if (callBack != null)
                            callBack.onError(e);
                    }
                } catch (Exception e1) {
                    //error
                    if (callBack != null)
                        callBack.onError(e);
                }
            }

            @Override
            public void onComplete() {

            }


            @Override
            public void onSubscribe(Disposable d) {
                if (callBack != null)
                    callBack.onStart();
            }

            @Override
            public void onNext(T o) {
                if (callBack != null)
                    callBack.onSuccess(o);
            }
        };
    }

    public <T> ObservableTransformer<T, T> transformer() {
        do {

            if (activity != null) {
                return getObservableTransformer(activity);
            }
            if (fragment != null) {
                return getObservableTransformer(fragment);
            }

        } while (false);
        return null;
    }

    @android.support.annotation.NonNull
    private <T> ObservableTransformer<T, T> getObservableTransformer(RxAppCompatActivity rxAct) {
        return new ObservableTransformer<T, T>() {
            @Override
            public ObservableSource<T> apply(@NonNull Observable<T> upstream) {
                return upstream.subscribeOn(Schedulers.io())
                        .observeOn(AndroidSchedulers.mainThread())
                        .compose(rxAct.bindToLifecycle());
            }
        };
    }

    @android.support.annotation.NonNull
    private <T> ObservableTransformer<T, T> getObservableTransformer(RxFragment rxFragment) {
        return new ObservableTransformer<T, T>() {
            @Override
            public ObservableSource<T> apply(@NonNull Observable<T> upstream) {
                return upstream.subscribeOn(Schedulers.io())
                        .observeOn(AndroidSchedulers.mainThread())
                        .compose(rxFragment.bindToLifecycle());
            }
        };
    }

    /**
     * 通过反射拿到泛型 class
     */
    @SuppressWarnings("unchecked")
    public Class<M> getClz() {
        if (clazz == null) {
            clazz = (Class<M>) (((ParameterizedType) this.getClass().getGenericSuperclass()).getActualTypeArguments()[0]);
        }
        return clazz;
    }

}
构造函数中的RxAppCompatActivityRxFragment
为了支持绑定`RxLifecycle`所以在初始化的时候必须传递进来。
get函数
    封装了`RxJava`中的被观察者,在`onError`中处理了服务器发出的错误,和`RxJava`抛出的`Throwable`;

前面说到了`HTTPCallbackWrapper`的两个泛型。重点在`M`。 

```
M response = gson.fromJson("", getClz());
```
怎么让onFail返回多种对象呢?
    之前我想多个类实现一个接口,之后让`onFail`的参数为此接口,后来想到,如果这样做,调用`onFail`的时候得到的是接口对象,还需要根据`host`来确定对象类型,这样就违背了我的初衷。

所以我想到了继续用泛型,用泛型就涉及到一个问题。
怎么得到泛型的class
完美解决问题,感兴趣的同学可以查一下反射相关的。
    /**
     * 通过反射拿到泛型 class
     */
    @SuppressWarnings("unchecked")
    public Class<M> getClz() {
        if (clazz == null) {
            clazz = (Class<M>) (((ParameterizedType) this.getClass().getGenericSuperclass()).getActualTypeArguments()[0]);
        }
        return clazz;
    }
封装RxJava的转换ObservableTransformertransformer函数)

线程切换和RxLifecycle的绑定生命周期每次都会出镜,当然要封装起来啦,我还能怎么办。。。

配合MVP食用,口感更佳哦~

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用RxJava2 + Retrofit2 + OKHttp进行POST请求,可以按照以下步骤进行: 1. 添加依赖 在项目的build.gradle文件中添加以下依赖: ``` dependencies { implementation 'io.reactivex.rxjava2:rxjava:2.2.19' implementation 'io.reactivex.rxjava2:rxandroid:2.1.1' implementation 'com.squareup.retrofit2:retrofit:2.9.0' implementation 'com.squareup.retrofit2:converter-gson:2.9.0' implementation 'com.squareup.okhttp3:okhttp:4.9.1' } ``` 2. 创建Service接口 创建一个接口,用于定义POST请求的方法。例如: ``` public interface ApiService { @POST("login") Observable<LoginResponse> login(@Body LoginRequest request); } ``` 3. 创建Retrofit对象 在Application类或其他初始化类中,创建Retrofit对象: ``` public class MyApp extends Application { private static ApiService apiService; @Override public void onCreate() { super.onCreate(); // 创建OkHttpClient对象 OkHttpClient client = new OkHttpClient.Builder() .connectTimeout(10, TimeUnit.SECONDS) .readTimeout(10, TimeUnit.SECONDS) .writeTimeout(10, TimeUnit.SECONDS) .build(); // 创建Retrofit对象 Retrofit retrofit = new Retrofit.Builder() .baseUrl("http://example.com/api/") .client(client) .addConverterFactory(GsonConverterFactory.create()) .addCallAdapterFactory(RxJava2CallAdapterFactory.create()) .build(); apiService = retrofit.create(ApiService.class); } public static ApiService getApiService() { return apiService; } } ``` 4. 发起POST请求 在需要发起POST请求的地方,可以使用以下代码: ``` LoginRequest request = new LoginRequest(); request.setUsername("admin"); request.setPassword("123456"); MyApp.getApiService().login(request) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Observer<LoginResponse>() { @Override public void onSubscribe(Disposable d) { } @Override public void onNext(LoginResponse response) { // 处理响应数据 } @Override public void onError(Throwable e) { // 处理异常 } @Override public void onComplete() { } }); ``` 上述代码中,我们首先创建了一个LoginRequest对象,用于存储要发送的数据。然后调用MyApp.getApiService().login(request)方法,发起POST请求。在这里,我们使用了RxJava2的Observable对象,将请求结果封装为一个可观察对象。使用subscribeOn(Schedulers.io())指定在IO线程中进行网络请求,使用observeOn(AndroidSchedulers.mainThread())指定在主线程中处理响应。最后通过subscribe方法订阅请求结果,处理响应数据或异常。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值