Retrofit + Rxjava 实践Demo(二)

如果是简单的网络请求,那么任何一个主流的网络框架都能够胜任,有一种情况是其它网络框架可以胜任,但是写出来是巨丑无比的,就是在需要嵌套请求的时候。

假设需要先get一个地址,获取一个key,然后通过这个key组合一个新的url,再get这个新的url,获取结果(简单的单层嵌套),下面是普通框架与retrofit + rxjava的代码

一 : 普通网络框架嵌套请求的伪代码

request.get(url,new callback() {

              public onSuccess(Response response) {
                  String key = response.body().getKey();
                  String newUrl = url + "?key=" + key;
                  new Request.get(newUrl, new callback() {

                      public onSuccess(Response response) {
                          //todo something with response
                      }

                      public onFalied(String error) {
                          Log.e(TAG, "onFalied: " error);
                      }


                  });
              }

              public onFalied(String error) {
                  Log.e(TAG, "onFalied: " error);
              }


          });

二 :retrofit + rxjava(下面以showapi上的唯一小说接口为例)
接口:

http://route.showapi.com/211-2

假设我们需要查看斗破苍穹这本书的第一章,我们先需要搜索这本小说(万一没有呢).
为了简便,以获取的所有书目的第一个为准

Retrofit retrofit = new Retrofit.Builder()
                .baseUrl("http://route.showapi.com/")
                .addConverterFactory(GsonConverterFactory.create())
                .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
                .build();
        IBookService bookService = retrofit.create(IBookService.class);
        bookService.getBooksByKeyWord("斗破苍穹")
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Action1<BookEntity>() {
                    @Override
                    public void call(BookEntity bookEntity) {
                        Log.e(TAG, "call: " + bookEntity.getShowapi_res_body().getPagebean().getContentlist().get(0).getName());
                    }
                });

可以看出rxjava可以很方便的转换线程
下面就是rxjava的强大之处,我们要根据获取到的书的id再获取所有章节目录,只需要改动很少的代码

Retrofit retrofit = new Retrofit.Builder()
                .baseUrl("http://route.showapi.com/")
                .addConverterFactory(GsonConverterFactory.create())
                .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
                .build();
        final IBookService bookService = retrofit.create(IBookService.class);
        bookService.getBooksByKeyWord("斗破苍穹")
                .subscribeOn(Schedulers.io())
                .flatMap(new Func1<BookEntity, Observable<ItemBookEntity>>() {
                    @Override
                    public Observable<ItemBookEntity> call(BookEntity bookEntity) {
                        String id = bookEntity.getShowapi_res_body().getPagebean().getContentlist().get(0).getId();
                        return bookService.getBookById(id);
                    }
                })
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Subscriber<ItemBookEntity>() {
                    @Override
                    public void onCompleted() {
                        Log.e(TAG, "onCompleted: ");
                    }

                    @Override
                    public void onError(Throwable e) {
                        Log.e(TAG, "onError: " + e.getMessage());
                    }

                    @Override
                    public void onNext(ItemBookEntity itemBookEntity) {
                        for (ChapterListBean chapter : itemBookEntity.getShowapi_res_body().getBook().getChapterList()) {
                            Log.e(TAG, "call: " + chapter.getName());
                        }
                    }
                });

为了可以捕捉异常,所以最后用了一个完整的Subscriber
rxjava可以将转换一系列的事件与对象,如果只是普通对象的转换,只需要用map就可以了,如果需要事件的转换,可以用flatMap,那么即使事件过程中需要转换再多次,代码完全写下来,逻辑还是很清楚的,不会因为过多的嵌套而变得特别难阅读。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值