android - RxJava android 链接请求

标签 android rx-java retrofit2 chaining rss-reader

我将 Retrofit 与 RxJAva 一起用于获取 Rss 提要的应用程序,但 rss 不包含所有信息,因此我使用 jsoup 来解析每个项目链接,以检索图像和文章的描述。现在我这样使用它:

    public Observable<Rss> getDumpData() {
    System.out.println("in the getDumpData");
    if (newsAppService == null) {
        System.out.println("newsAppServer is null");
    }
    return newsAppService.getDumpData()
            .flatMap(new Func1<Rss, Observable<Rss>>() {
                @Override
                public Observable<Rss> call(Rss rss) {
                    List<Item> items = new ArrayList<Item>();
                    for (int i = 0; i < rss.channel.items.size(); i++) {
                        Document document = null;
                        try {
                            document = Jsoup.connect(rss.channel.items.get(i).link).get();
                            Element element = document.select("div[itemprop=image] > img").first();
                            Element bodyElement = document.select("div[class=articlebody]").first();
                            System.out.println("got element " +bodyElement.toString());
                            rss.channel.items.get(i).image = element.attr("src");
                            items.add(rss.channel.items.get(i));
                        } catch (IOException e) {
                            e.printStackTrace();
                        }

                    }
                    rss.channel.items = items;
                    rss.version = "Mams :D";
                    return Observable.just(rss);
                }
            })
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread());
}

干净吗?有没有更好的办法 ?

最佳答案

让我们看看...

public Observable<Rss> getDumpData() {
  System.out.println("in the getDumpData");
  if (newsAppService == null) {
    System.out.println("newsAppServer is null");
  }
  return newsAppService.getDumpData()
     .flatMap(rss -> Observable
       .from(rss.channel.items)
       .observeOn(Schedulers.io())
       .flatMap(Checked.f1(item -> Observable
         .just(Jsoup.connect(item.link).get())
         .map(document -> document.select("div[itemprop=image] > img").first())
         .doOnNext(element -> item.image=element.attr("src"))
        ))
      )
      .ignoreElements()
      .defaultIfEmpty(rss)
      .subscribeOn(Schedulers.io())
      .observeOn(AndroidSchedulers.mainThread());
}

检查的类来自rxJava-extras,但是你可以很容易地自己写一个。是的,Java 8 确实有助于 Rx;以上将同时对网络进行所有调用。

关于android - RxJava android 链接请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40116640/

相关文章:

android - Retrofit 2 + RxJava 将类似的请求干净地链接在一起

java - 你如何链接多个可观察对象?

java - RxJava 和 Retrofit - 链式服务响应

android - 是否有使用 VerticalGrid 而不是 Horizo​​ntalGridView 的 ListRowPresenter?

android - 为完整的 android 应用程序添加自定义字体

android - Retrofit2 和 rxjava - 如何在 android 中组合两个依赖的网络调用

android - 如何等到一堆电话结束再打一个电话

android - 网络pojo类和数据库实体类,如何避免重复

android - PdfDocument 分两页打印

android - DataBindingUtil findBinding(查看 View )与 getBinding(查看 View )