unSubscribeOn调用了什么线程?我们应该打电话吗?

ach*_*hie 8 java android rx-java rx-android

什么线程是unsubscribeOn默认为我们没有指定它但仍指定subscribeOn的线程?我们是否需要指定我们想要取消订阅的线程,即使它与subscribeOn中使用的线程相同?

或者底部的两个片段是否为取消订阅做同样的事情?

选项1:

mSubscription.add(myAppProvider
        .getSomeData()
        .subscribeOn(Schedulers.io())
        .observeOn(AndroidSchedulers.mainThread())
        .unsubscribeOn(Schedulers.io())
        .subscribe(data -> handleData(data),
                throwable -> handleError(throwable)
                ));
Run Code Online (Sandbox Code Playgroud)

选项2:

mSubscription.add(myAppProvider
        .getSomeData()
        .subscribeOn(Schedulers.io())
        .observeOn(AndroidSchedulers.mainThread())
        .subscribe(data -> handleData(data),
                throwable -> handleError(throwable)
                ));
Run Code Online (Sandbox Code Playgroud)

我确实看过Rx-Java文档,但他们只解释了subscribeOn,但没有解释unSubscribeOn

drh*_*rhr 4

如果没有subscribeOn(和没有observeOn),您的取消订阅操作将在订阅启动的任何线程上发生。

使用subscribeOn,您的取消订阅操作将在 指定的调度程序上发生subscribeOn

使用 时observeOn,您的取消订阅操作将在由 指定的调度程序上发生observeOn(覆盖由 指定的调度程序subscribeOn)。

这是一个示例。正如那里所建议的,当取消订阅本身涉及您想要在其他线程上运行的长时间运行的操作时,这非常有用。

如果你运行他们的测试代码:

Observable<Object> source = Observable.using(
    () -> {
        System.out.println("Subscribed on " + Thread.currentThread().getId());
        return Arrays.asList(1,2);
    },
    (ints) -> {
        System.out.println("Producing on " + Thread.currentThread().getId());
        return Observable.from(ints);
    },
    (ints) -> {
        System.out.println("Unubscribed on " + Thread.currentThread().getId());
    }
);

source
    .unsubscribeOn(Schedulers.newThread())
    .subscribe(System.out::println);
Run Code Online (Sandbox Code Playgroud)

您应该看到他们的预期输出:

 Subscribed on 1
 Producing on 1
 1
 2
 Unubscribed on 11
Run Code Online (Sandbox Code Playgroud)

如果删除该unsubscribeOn行,您将看到:

 Unsubscribed on 1
Run Code Online (Sandbox Code Playgroud)