java - 如何使用 RxJava 1.x 来 takeUntil 进行分页,该分页必须调用具有不同数据的每个页面?

标签 java rx-java

我在这个问题上看到了很多变体。然而,没有一个能完全代表我的情况。我已经进行了一些测试,但我不清楚如何继续实现下面的方法 getPages 。策略是在第一次调用时调用 PageProvider#getPage(null),然后调用 PageProvider#getPage(page.next) (其中 page是最后一次调用返回的页面),直到 page.done() 返回 true

import org.junit.Test;
import rx.Observable;
import rx.Single;

import java.util.HashMap;
import java.util.Map;
import java.util.UUID;

public class RxJava1TakeUntilTest {
  PageProvider provider = new PageProvider(3);

  Observable<PageProvider.Page> getPages() {
    // TODO: call provider.getPage(null) then provider.getPage(page.next) until page.done() is true
    return null;
  }

  @Test
  public void testTakeUntil() {
    getPages().subscribe(page -> System.out.println(page.toString()));
  }

  public static class PageProvider {
    public static class Page {
      public String current;
      public String next; // is null if no more pages

      public Page(String current, String next) {
        this.current = current;
        this.next = next;
      }

      public boolean done() {
        return next == null;
      }

      @Override
      public String toString() {
        return current + " -> " + next;
      }
    }

    int pageCount;
    Page firstPage;
    Map<String, Page> pages = new HashMap<>();

    public PageProvider(int pageCount) {
      this.pageCount = pageCount;
      for (int i = 0; i < pageCount; i++) {
        Page page = new Page(uuid(), i == pageCount - 1 ? null : uuid());
        if (i == 0) firstPage = page;
        pages.put(page.current, page);
      }
    }

    public Single<Page> getPage(String index) {
      return Single.just(index == null ? firstPage : pages.get(index));
    }

    static String uuid() {
      return UUID.randomUUID().toString();
    }
  }
}

如果您想创建一个快速的 Java 项目,这里有一个 build.gradle 文件:

plugins {
  id 'java-library'
}
repositories {
  mavenCentral()
}
dependencies {
  compile 'io.reactivex:rxjava:1.3.8'

  testCompile 'junit:junit:4.12'
}

提前致谢。

最佳答案

PageProvider 实现不正确(您的页面未链接),但是一旦修复,您就可以使用实现分页

Observable<PageProvider.Page> getPages() {
    BehaviorSubject<String> pageControl = BehaviorSubject.create((String)null);
    Observable<PageProvider.Page> ret = pageControl.asObservable()
            .concatMap(apageIndex ->
                       provider.getPage(apageIndex).toObservable().doOnNext(
                               page-> {
                                   if (page.next == null)
                                       pageControl.onCompleted();
                                   else
                                       pageControl.onNext(page.next);
                               }));
    return ret;
}

关于java - 如何使用 RxJava 1.x 来 takeUntil 进行分页,该分页必须调用具有不同数据的每个页面?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51403854/

相关文章:

android - recyclerview 上没有显示数据

java - 如何将 RxJava combineLatest 运算符与超过 9 个可观察对象一起使用

java - OSGi 下配置不同/运行 "modes"?

rx-java - RxJava1 与 Rxjava2 : Exception in onNext

java - 如何在 RxJava 中正确转换多播可观察对象

android - RxAndroidBle 保持持久连接 + 写/通知处理

java - 如何sqlite + listview + onListItemClick启动新的Activity?光标读取错误

java - Java World 中有类似 dotnetshoutout.com & dotnetkicks.com 的资源吗?

java - 如何在Java中使用Sitemap进行网络爬虫?

java - Maven 不能在 jenkins 上运行(但它可以通过 eclipse 和命令行运行)