【问题标题】:Rxjava onNext not firing via retrofit observableRxjava onNext 没有通过改造 observable 触发
【发布时间】:2016-06-13 16:25:55
【问题描述】:

我有这个简单的 retrofit2 api 接口,其中包含

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() 没有被调用。没有调用任何生命周期方法。

为了澄清起见,我只是返回我在其他地方使用它的 observable,我在主线程上观察并订阅 IO。

【问题讨论】:

    标签: android retrofit2 rx-android


    【解决方案1】:

    不要使用 doOnNext,只需映射。并尝试习惯使用 lambda,让您的代码更具可读性。

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

    现在作为概念,每当一些观察者订阅这个 observable 消费项目,然后 observable 自动取消订阅观察者。所以你不必担心退订任何东西。

    您可以在此处查看一些实际示例。 https://github.com/politrons/reactive

    【讨论】:

    • 或者只是 .flatMap.flatMap(response -&gt; Observable.just(response.getDataForList())
    • 是的,那更好。但是因为这家伙似乎是从 RxJava 婴儿步骤开始 XD
    • 但是我的方法有什么问题。如果我真的想根据活动/片段生命周期控制取消订阅怎么办。
    • 你可以,但我只是告诉你取消订阅是自动完成的。
    • 所以我解决了我的问题,只是要添加主要问题是我正在使用复合订阅,我正在调用 unsubscribe ,根据文档取消订阅本身和所有内部订阅。调用此方法后,添加到 CompositeSubscription 的新订阅将立即取消订阅。 link
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-11
    • 1970-01-01
    相关资源
    最近更新 更多