美文网首页Android开发Android开发经验谈Android技术知识
封装RxJava+Retrofit+OkHttp系列——(二)自

封装RxJava+Retrofit+OkHttp系列——(二)自

作者: pokerfaceCmy | 来源:发表于2019-04-24 14:28 被阅读2次

封装RxJava+Retrofit+OkHttp系列——(一)自动处理网络请求出错

完整项目Github地址:戳这里!!!

前言

使用上一篇说的方法封装完成后,我们的网络请求代码应该是这样的:

HttpManager.getInstance()
            .getRetrofitService(ApiServer.class)
                        .getLogin("")
                        .subscribeOn(Schedulers.io())
                        .observeOn(AndroidSchedulers.mainThread())
                        .subscribe(new .....);

存在的问题

还是不够简洁。每次调用真正的网络请求方法getLogin()之后,都要去切换一下线程,如果能省略掉着两行就好了。

解决办法

接着改些HttpManager类,让他能实现自动的线程转换
关键方法:

    /**
     * 线程转换
     *
     * @param <T> T
     * @return ObservableTransformer
     */
    private static <T> ObservableTransformer<T, T> apiIoToMain() {
        return upstream -> upstream
                .subscribeOn(Schedulers.io())
                .unsubscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread());
    }

ObservableTransformer是rxjava提供的转换器,不清楚怎么用没关系,知道这样写就好了,接下来写个方法来调用apiIoToMain()实现线程转换

public static <T> Observable<T> composeRequest(Observable<T> observable) {
        return observable.compose(apiIoToMain());
    }

调用线程转换的方法

    /**
     * 自动线程转换,返回observer交给调用者去处理
     *
     * @param map 登录参数
     * @return Observable对象
     */
 @Override
    public Observable<BaseResponse<LoginBean>> getLogin(Map<String, Object> map) {
        return HttpManager.composeRequest(HttpManager.create(LoginContract.Model.class).nameLogin(map));
    }

最终的调用

在Activity或者presenter中调用:

new LoginModel().getLogin(treeMap).subscribe(new ...);

简简单单一句话,然后实现默认的onSuccess()回调方法,就能轻轻松松的访问网络请求了,是不是很爽呢?

完整项目Github地址:戳这里!!!

相关文章

网友评论

    本文标题:封装RxJava+Retrofit+OkHttp系列——(二)自

    本文链接:https://www.haomeiwen.com/subject/rblggqtx.html