RxJava 订阅者作为参数不起作用,新的相同订阅者工作
RxJava subscriber as a parameter does not work, new identical subscriber work
我们在我们的应用程序中使用 rxandroid:1.1.0
和 rxjava:1.1.2
。
我们的项目以这种方式创建了 RxJava 订阅者:
- Android Activity 创建订阅者。当用户删除一个项目时,我们将订阅者作为参数传递给 "network service" class 我们有
- 网络服务class设置Observable,并获取订阅者作为参数。 Observable 设置为订阅 Subscriber 参数
不幸的是,这不起作用。订阅者永远不会被调用,我们也不会收到错误或任何更多信息。
但是,如果我不使用参数 Subscriber,而是同时创建一个全新的 Subscriber,Observable 就可以正常工作。
知道如何使用参数 Subscriber 使它工作吗?我们想从无法从网络服务 class.
访问的 Activity 调用 UI 方法 onComplete
这是我的 activity 代码:
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);
}
}
这是来自我的网络服务的代码 class。
这个版本不工作:
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);
}
但是这个版本的网络服务class方法工作正常。注意新订阅者:
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");
}
});
}
如有任何帮助,我们将不胜感激。谢谢!
不要重复使用 Subscriber
。 Subscriber
是一个 Subscription
并且它是有状态的。 Subscriber
退订后不会收到通知
您可以改用 Observer
。
我们在我们的应用程序中使用 rxandroid:1.1.0
和 rxjava:1.1.2
。
我们的项目以这种方式创建了 RxJava 订阅者:
- Android Activity 创建订阅者。当用户删除一个项目时,我们将订阅者作为参数传递给 "network service" class 我们有
- 网络服务class设置Observable,并获取订阅者作为参数。 Observable 设置为订阅 Subscriber 参数
不幸的是,这不起作用。订阅者永远不会被调用,我们也不会收到错误或任何更多信息。
但是,如果我不使用参数 Subscriber,而是同时创建一个全新的 Subscriber,Observable 就可以正常工作。
知道如何使用参数 Subscriber 使它工作吗?我们想从无法从网络服务 class.
访问的 Activity 调用 UI 方法 onComplete这是我的 activity 代码:
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);
}
}
这是来自我的网络服务的代码 class。 这个版本不工作:
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);
}
但是这个版本的网络服务class方法工作正常。注意新订阅者:
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");
}
});
}
如有任何帮助,我们将不胜感激。谢谢!
不要重复使用 Subscriber
。 Subscriber
是一个 Subscription
并且它是有状态的。 Subscriber
退订后不会收到通知
您可以改用 Observer
。