处置Disposable保证没有未来的电话吗?

时间:2018-05-17 03:32:32

标签: rx-java2

处置Disposable返回的Observable#subscribe(Consumer)是否保证Consumer不会再收到accept的来电?如果没有,我怎样才能获得这样的保证?

如果它有所不同,则会发现Observable并且Disposable处于同一个单线程Scheduler中。

1 个答案:

答案 0 :(得分:2)

  

处理从Observable返回的Disposable#subscribe(消费者)是否保证消费者不会再收到接受的电话?

没有这样的硬保证。 RxJava 2尽最大努力在异步取消时停止发射,但发布取消的线程可能会稍微延迟,从外部来看,一个或多个项目仍然可以通过。

  

如果没有,我怎样才能获得这样的保证呢?

你可以让事情变得更加热切和互相排斥,但在异步世界中,通常很难分辨出事先发生的事情或行动中的事情。

  

如果它有所不同,则观察Observable并将Disposable置于同一个单线程调度程序中。

如果取消按顺序发生,例如使用take(2),则同步连接的上游将停止发送项目:range(1, 5).take(2)将永远不会尝试发出3, 4, 5。但是,

range(1, 5)
.map(v -> v + 1)
.observeOn(io())
.take(2)
.subscribe()

可以运行1..5并执行映射,然后才能看到值2

根据您拥有的流的类型,将任务发送到调度程序以在该调度程序上处理正在运行的序列可能永远不会执行,因为它被当前正在发出的任务阻止,因此以下内容不会停止序列:

var single = Schedulers.single();

var dispose = single.scheduleDirect(() -> {
    while (!Thread.currentThread().isInterrupted()) {
        System.out.println("Processing...");
    }
});

// this will not execute
single.scheduleDirect(() -> dispose.dispose());

// but this will stop the processing
dispose.dispose();

Thread.sleep(1000);