【问题标题】:RxJava subscriber as a parameter does not work, new identical subscriber workRxJava 订阅者作为参数不起作用,新的相同订阅者起作用
【发布时间】:2016-04-12 17:12:57
【问题描述】:

我们在应用程序中使用rxandroid:1.1.0rxjava:1.1.2。 我们的项目有这样创建的 RxJava 订阅者:

  • Android Activity 创建订阅者。当用户删除一个项目时,我们将订阅者作为参数传递给我们拥有的“网络服务”类
  • 网络服务类设置 Observable,并获取订阅者作为参数。 Observable 设置为订阅 Subscriber 参数

不幸的是,这不起作用。订阅者永远不会被调用,我们也不会收到错误或任何更多信息。

但是,如果我不使用参数 Subscriber 而不是同时创建一个全新的 Subscriber,那么 Observable 就可以正常工作。

知道如何使用参数订阅者进行这项工作吗?我们想从 Activity 调用 UI 方法 onComplete ,这些方法无法从网络服务类访问。

这是我的活动代码:

public Subscriber<Models.FavoriteResponse> mFavoritesSubscriber = new Subscriber<Models.FavoriteResponse>() {
    @Override
    public void onCompleted() {
        // empty
        Logger.w("mFavoritesSubscriber onCompleted");
        showFavorites();
    }

    @Override
    public void onError(Throwable e) {
        Logger.w("mFavoritesSubscriber onError");
    }

    @Override
    public void onNext(Models.FavoriteResponse favoriteResponse) {
        Logger.w("mFavoritesSubscriber onNext");
        getHelper().setIsFavoriteOnProducts(favoriteResponse.getFavoriteResponseList());
    }
};

private void removeSelectedFavorites() {
    for (Product selectedProduct : selectedProducts) {
        ServiceUtils.removeFavorite(this, selectedProduct.sku, mFavoritesSubscriber);
    }
}

这是我的网络服务类的代码。 这个版本不行:

public static void removeFavorite(final Context context, final String sku, Subscriber<Models.FavoriteResponse> subscriber) {

    Logger.w("ServiceUtils removeFavorite");

    String userId = PersistentSharedPreferences.readUserId(context);
    FavoritesServices service = FavoritesServices.Companion.create(BuildConfig.ORDER_SERVICE_DOMAIN,
            new Interceptor(context));
    final Observable<Models.FavoriteResponse> observable = service
            .deleteFavorite(userId, sku, getFavoritesParameters(context));

    observable.subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .onErrorResumeNext(new Func1<Throwable, Observable<? extends Models.FavoriteResponse>>() {
                @Override
                public Observable<? extends Models.FavoriteResponse> call(Throwable throwable) {
                    Logger.w("ServiceUtils onErrorResumeNext");
                    return null;
                }
            })
            .subscribe(subscriber);
}

但是这个版本的网络服务类方法可以正常工作。注意新的订阅者:

public static void removeFavorite(final Context context, final String sku, Subscriber<Models.FavoriteResponse> subscriber) {

    Logger.w("ServiceUtils removeFavorite");

    String userId = PersistentSharedPreferences.readUserId(context);
    FavoritesServices service = FavoritesServices.Companion.create(BuildConfig.ORDER_SERVICE_DOMAIN,
            new Interceptor(context));
    final Observable<Models.FavoriteResponse> observable = service
            .deleteFavorite(userId, sku, getFavoritesParameters(context));

    observable.subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .onErrorResumeNext(new Func1<Throwable, Observable<? extends Models.FavoriteResponse>>() {
                @Override
                public Observable<? extends Models.FavoriteResponse> call(Throwable throwable) {
                    Logger.w("ServiceUtils onErrorResumeNext");
                    return null;
                }
            })
            .subscribe(new Subscriber<Models.FavoriteResponse>() {
                @Override
                public void onCompleted() {
                    Logger.w("ServiceUtils Subscriber onCompleted");
                }

                @Override
                public void onError(Throwable e) {
                    Logger.w("ServiceUtils Subscriber onError");
                }

                @Override
                public void onNext(Models.FavoriteResponse favoriteResponse) {
                    Logger.w("ServiceUtils Subscriber onNext");
                }
            });
}

任何帮助将不胜感激。谢谢!

【问题讨论】:

    标签: android rx-java retrofit2 rx-android subscriber


    【解决方案1】:

    不要重复使用SubscriberSubscriberSubscription,它是有状态的。 Subscriber退订后不会收到通知。

    您可以改用Observer

    【讨论】:

    • 天哪,这行得通!但为什么?订阅者不是观察者的实现吗?那为什么还要使用订阅者呢?
    • 是的。但是 Observer 并不要求实现应该是无状态的。如果你实现了一个有状态的观察者,它也将不能被重用。在这里您可以重用Observer,因为在您的情况下它将是无状态的。
    • 它的工作方式是否相同?我的意思是我的代码可以在这 5 分钟的测试运行中运行,但是使用 Observer 而不是 Subscriber 是否有任何副作用?
    • 在你的情况下,不。你的观察者没有任何副作用。实际上,RxJava 每次都会创建一个新的 Subscriber 来包装你的 Observer。
    • 好的,太棒了。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2018-09-16
    • 2014-10-06
    • 1970-01-01
    • 2017-11-18
    • 2022-01-04
    • 2019-05-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多