У меня есть следующий код:

repo.getObservable()
            .timeout(1, TimeUnit.MINUTES)
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .doOnSubscribe {
                _isInProgress.value = true
            }
            .doFinally {
                _isInProgress.value = false
            }
            .subscribe(
                    {
                        Timber.d("Success")
                    },
                    {

                        Timber.e(it)
                    })
            .trackDisposable()

Проблема в том, что я успешно получаю сообщение об успехе через пару секунд, но мой предварительный загрузчик все еще ждет 1 минуту, а затем выполняется моя часть подписки с ошибкой. Это ожидаемое поведение? Что я могу сделать, чтобы остановить тайм-аут, если успешная часть подписки будет выполнена?

P. S. Observable, возвращаемая из getObservable (), создается следующим образом: PublishSubject.create ()

2
SMGhost 19 Дек 2019 в 11:20

2 ответа

Это должно быть потому, что вы не вызываете onComplete для PublishSubject, и вызывается только onNext. Смотрите этот пример:

PublishSubject<Integer> source = PublishSubject.create();

// It will get 1, 2, 3, 4 and onComplete
source.subscribe(getFirstObserver()); 

source.onNext(1);
source.onNext(2);
source.onNext(3);

// It will get 4 and onComplete for second observer also.
source.subscribe(getSecondObserver());

source.onNext(4);
source.onComplete();

Пока не вызывается onComplete, наблюдатели ждут новых результатов. Вы можете либо unsubscribe/dispose после получения ожидаемого результата, либо вызвать onComplete в Observable после отправки всех результатов.

2
jeprubio 19 Дек 2019 в 12:22

Если вам нужен один результат, используйте take(1) до или после timeout:

repo.getObservable()
        .take(1) // <---------------------------------------------
        .timeout(1, TimeUnit.MINUTES)
        .subscribeOn(Schedulers.io())
        .observeOn(AndroidSchedulers.mainThread())
        .doOnSubscribe {
            _isInProgress.value = true
        }
        .doFinally {
            _isInProgress.value = false
        }
        .subscribe(
                {
                    Timber.d("Success")
                },
                {

                    Timber.e(it)
                })
        .trackDisposable()
0
akarnokd 19 Дек 2019 в 14:27