Rx Java: запустить наблюдаемый в другом потоке и заблокировать - PullRequest
0 голосов
/ 13 марта 2020

Я хочу запустить наблюдаемое и дождаться его окончания sh, блокируя. Причина в том, что я уже в фоновом потоке, и мне нужно получить результат, чтобы вернуть успех или неудачу.

Тестируя в примере приложения, я делаю:

Completable.fromRunnable(() -> System.out.println(String.format("[%s] observable", Thread.currentThread().getName())))
    .subscribeOn(Schedulers.single())
    .doOnComplete(() -> System.out.println(String.format("[%s] complete", Thread.currentThread().getName())))
    .blockingAwait();
  System.out.println(String.format("[%s] main", Thread.currentThread().getName()));

Что печатает (как я и ожидал):

[RxSingleScheduler-1] observable
[RxSingleScheduler-1] complete
[main] main

Однако в моем приложении Android я нахожусь в контексте потока адаптера syn c (фонового потока), и я делаю то же самое (?):

syncApps.getObservable(SyncApps.DOWNLOAD)
    .subscribeOn(Schedulers.single())
    .doOnComplete(() -> { ... })
    .doOnError(t -> { ... }
    .blockingAwait();

Когда я регистрирую поток из наблюдаемой, возвращенной из syncApps.getObservable(), я все еще в том же потоке, из которого я инициировал вызов:

03-13 09:55:33.674 22201 25389 I SyncApps: getObservable(SyncApps.java:60): [SyncAdapterThread-2] Started...
...
03-13 09:55:33.683 22201 25389 I SyncApps: getObservable(SyncApps.java:81): [SyncAdapterThread-2] Finished

Почему я не работаю на Schedulers.single()? Я не вижу, что будет по-другому.

...