Rxjava onNext не срабатывает с помощью наблюдаемой модификации

У меня есть этот простой интерфейс API Retrofit2, который содержит

interface Api {
    @GET(BuildConfig.END_POINT) Observable<Response> fetchData();
}

Так что все в порядке, когда я делаю новый запрос, но, скажем, я запускаю запрос и немедленно отменяю подписку, а затем я пытаюсь запустить новый запрос, он ничего не возвращает.

Итак, в коде это выглядит примерно так:

в Activity::onPause я отменяю подписку, а в Activity::onResume снова запускаю запрос.

Мой запрос выглядит примерно так:

api.fetchData()
    .timeout(30,TimeUnit.SECONDS)
    .doOnNext(new Action1<Response>() {
        @Override public void call(Response response) {
            list = response.getDataForList();
        }
    }).flatMap(new Func1<Response, Observable<List<Object>>>() {
        @Override public Observable<Object>> call(Response response) {
            return Observable.just(list);
        }
    });

Когда я пытался его отладить, вызов выполняется, но doOnNext() не вызывается. Ни один из методов жизненного цикла не вызывается.

И просто для пояснения здесь я просто возвращаю наблюдаемое, которое я использую где-то еще, где я наблюдаю за основным потоком и подписываюсь на ввод-вывод.


person user3354265    schedule 12.06.2016    source источник


Ответы (1)


Не используйте doOnNext, просто сопоставьте. И постарайтесь привыкнуть к использованию лямбда-выражений, сделайте ваш код более читабельным.

api.fetchData()
.timeout(30,TimeUnit.SECONDS)
.map(response -> response.getDataForList())
.flatMap(list -> Observable.just(list));

Теперь, как концепция, каждый раз, когда какой-то наблюдатель подписывается на этот наблюдаемый объект, потребляет элементы, тогда наблюдаемый автоматически отменяет подписку наблюдателя. Так что вам не нужно беспокоиться о том, чтобы отписаться от чего-либо.

Здесь вы можете увидеть несколько практических примеров. https://github.com/politrons/reactive

person paul    schedule 13.06.2016
comment
или просто .flatMap с .flatMap(response -> Observable.just(response.getDataForList()) - person Bartek Lipinski; 13.06.2016
comment
да, так даже лучше. Но так как парень, кажется, начинает с RxJava маленькими шагами XD - person paul; 13.06.2016
comment
Но что не так в моем подходе. Что делать, если я действительно хочу контролировать отказ от подписки в зависимости от жизненного цикла активности/фрагмента. - person user3354265; 13.06.2016
comment
Можно, но я просто сообщаю, что отписка происходит автоматически. - person paul; 13.06.2016
comment
Аааа я вижу. Спасибо :) И почему doOnNext здесь не подходит? - person user3354265; 13.06.2016
comment
Проблема все еще существует, если я выполняю отмену подписки, как только делаю запрос, а затем снова пытаюсь отправить запрос. - person user3354265; 13.06.2016
comment
Если вы не хотите никогда не отписываться от наблюдателя, вы можете использовать реле. Посмотрите здесь github.com/ politrons/reactive/blob/master/src/test/java/rx/ - person paul; 13.06.2016
comment
Я до сих пор не понимаю, что не так с doOnNext? Не могли бы вы пояснить..? Спасибо - person user3354265; 13.06.2016
comment
Итак, я решил свою проблему и просто добавил, что основная проблема заключалась в том, что я использовал составную подписку и вызывал отмену подписки, которая, согласно документам, отменяет подписку на себя и все внутренние подписки. После вызова этого метода новые подписки, добавленные в CompositeSubscription, будут немедленно отписаны. ссылка - person user3354265; 15.06.2016