我在这个问题上看到了很多变体。然而,没有一个能完全代表我的情况。我已经进行了一些测试,但我不清楚如何继续实现下面的方法 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/