每个任务Rxjava Android之间的时间延迟

时间:2016-11-20 01:19:16

标签: android multithreading rx-java rx-android

我必须重复安排observable NM次,每observableObservable<Precious> result = <~> // hidden for brevity (it's just a long time consuming observable that can take suppose up to 10 seconds or more) Observable.timer(M,TimeUnit.SECONDS).compose(x -> result).take(N).subscribe(); 秒之间延迟result秒:

O1 ____ 1秒____的 O2 ____ 1秒____的 O3 ____ 1秒____的 O4 (已完成)

注意开始和结束observable之间没有延迟,

void main(int argc, char *argv[]) {
    ...
    FILE *fp = fopen(argv[1], "rb");
    printf("Volume Label: %s\n", seekData(fp, 43, 11));
    ...
}

unsigned char* seekData(FILE *fp, int offset, int bytes) {
    unsigned char* buff = malloc(sizeof(unsigned char)*bytes);
    fseek(fp, offset, SEEK_SET);
    fread(buff, 1, bytes, fp);
    rewind(fp);
    return buff;
}

问题这是20 20 20 20 20 20 20 20 20 20 20可观察到的,它正在进行昂贵的网络呼叫,它会在计时器到期后自行调整,或者我们必须告诉它这样做,如果是这样的话?

2 个答案:

答案 0 :(得分:0)

你可以使用concatMap的组合来连接observable,并使用Delay来延迟每个的发射

/**
 * Another elegant solution it would be to create an observable with the list of items, and then use
 * concatMap to pass all items from the first observable to the second, then this second observable
 * can be created used delay operator afterwards.
 */
@Test
public void delayObservablesWithConcatMap() {
    Observable.from(Arrays.asList(Observable.just(1), Observable.just(2),Observable.just(3)))
            .concatMap(s -> s.delay(100, TimeUnit.MILLISECONDS))
            .subscribe(n -> System.out.println(n + " just emitted..."),
                    e -> {
                    },
                    () -> System.out.println("Everybody emitt!"));
    new TestSubscriber().awaitTerminalEvent(1000, TimeUnit.MILLISECONDS);

}

您可以在此处查看更多延迟示例https://github.com/politrons/reactive/blob/master/src/test/java/rx/observables/utils/ObservableDelay.java

答案 1 :(得分:0)

要从可观察的source中分隔出项目,以便每隔N秒发出一次,请使用以下模式:

source.zipWith(Observable.interval(1, TimeUnit.SECONDS), (src, dummy) -> src)

这里需要注意的是,如果您的source observable比间隔花费更多时间,那么这些项目就会排队。

现在我已经重新阅读了您的问题和说明,我认为您需要的是:

Observable.interval(1, TimeUnit.SECONDS)
.switchMap(dummy -> result)

这将取消订阅并重新订阅result每1秒观察一次。只有当result观察者取消取消订阅时的网络呼叫时,它才会起作用。