Без завершаемого.defer Я не знаю, где работает моя функция

#java #android #rx-java #rx-android

#java #Android #rx-java #rx-android

Вопрос:

Я в замешательстве. Я не нашел никаких статей об этом. Проверьте мой пример, в этом случае 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 без завершения.отложить.

Комментарии:

1. Во втором фрагменте » longOperation » будет работать в том же потоке, который вызывает doSomething() . Это действительно может быть поток пользовательского интерфейса, невозможно узнать, просто взглянув на эти фрагменты. Дело в том, что у вас есть Thread.sleep внутри » longOperation «, так что этот метод завершится только тогда, когда caret достигнет первого return оператора, что в вашем случае происходит через 5 секунд x<1 миллисекунд с момента вызова doSomething() .

2. вы имеете в виду 1-й фрагмент? потому что во втором longOperation не работал с пользовательским интерфейсом 🙂

3. Нет, я имею в виду второй фрагмент. И я не говорил, что это работает в пользовательском интерфейсе — я сказал, что это будет работать в любом потоке, который вызывает, doSomething() который может быть, а может и не быть потоком пользовательского интерфейса.

4. У меня проблема с longOperation , а не с doSomething 🙂

5. Вы спросили «какой поток longOperation выполняется во втором фрагменте». Мой ответ: «независимо от того, в каком потоке был вызван doSomething() метод». Есть ли у вас проблемы с doSomething или нет, этот факт не изменится.