Без Completable.defer я не знаю, где работает моя функция - PullRequest
0 голосов
/ 01 апреля 2019

Я в замешательстве. Я не нашел никаких статей об этом. Посмотрите мой пример, в этом случае longOperation будет работать с Schedulers.io ()

 private Completable longOperation() throws InterruptedException {
          Thread.sleep(5000);
          return Completable.complete();
      }

    private void doSomething() throws InterruptedException {
        CompositeDisposable compositeDisposable = new CompositeDisposable();
        compositeDisposable.add(Completable.defer(() -> longOperation())
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribeWith(new DisposableCompletableObserver() {
                    @Override
                    public void onComplete() {
                        customToast("long operation done");
                    }

                    @Override
                    public void onError(Throwable e) {

                    }
                }));
    }

но если я удалю Completable.defer(() -> longOperation()

private void doSomething() throws InterruptedException {
        CompositeDisposable compositeDisposable = new CompositeDisposable();
        compositeDisposable.add(longOperation()
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribeWith(new DisposableCompletableObserver() {
                    @Override
                    public void onComplete() {
                        customToast("long operation done");
                    }

                    @Override
                    public void onError(Throwable e) {

                    }
                }));
    }

Я не знаю где. В каком потоке будет работать мой метод longOperation? Я спрашиваю, потому что мой пользовательский интерфейс зависает после вызова doSomething без Completable.defer.

...