美文网首页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