【问题标题】:How can I reuse a Subscriber between two Observables (RxJava)如何在两个 Observables (RxJava) 之间重用订阅者
【发布时间】:2015-07-25 03:39:58
【问题描述】:

为了不重复我自己,我想在两个 observables 之间重用一个 Subscriber 变量。你如何做到这一点?我下面的当前代码不起作用,因为订阅者使用一次后,它被取消订阅,不再起作用。如果我 new Subscriber 而不是重用变量,我的订阅就有效。如果可能的话,我不想写两次相同的代码。

public class HomePresenter extends BasePresenter<HomeView> {
    ArticleRepo articleRepo;

    @Inject
    public HomePresenter(ArticleRepo articleRepo) {
        this.articleRepo = articleRepo;
    }

    @Override
    public void onCreate(@Nullable PresenterBundle bundle) {
        super.onCreate(bundle);
    }


    public void onEvent(ArticleCategoryClickedEvent event) {
        Timber.v("Adapter position clicked at position: '%d'", event.getAdapterPosition());
        view.launchArticleActivity(event.getArticleCategory());
    }

    public void onEvent(SeabeeOnlineExternalLinkClickedEvent event) {

    view.launchExternalLink(event.getSeabeeOnlineExternalLink());
}

public void loadArticleImages() {
    articleRepo.getArticleBuckets()
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(subscriber);
}

public void refreshData() {
    articleRepo.refreshAndSaveArticles()
            .flatMap(new Func1<List<ArticleEntity>, Observable<List<ImageArticleCategoryEntity>>>() {
                @Override
                public Observable<List<ImageArticleCategoryEntity>> call(List<ArticleEntity> articleEntityList) {
                    return articleRepo.getArticleBuckets();
                }
            }).subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(subscriber);

}

final Subscriber<List<ImageArticleCategoryEntity>> subscriber = new Subscriber<List<ImageArticleCategoryEntity>>() {
    @Override
    public void onCompleted() {
        Timber.v("Loading article images complete!");
        view.hideLoadingAnimation();
    }

    @Override
    public void onError(Throwable e) {
        Timber.e("Error loading article images", e);
        Log.e("tag", "Error loading article images", e);
    }

    @Override
    public void onNext(List<ImageArticleCategoryEntity> integerImageArticleCategoryEntityHashMap) {
        view.loadArticleImages(integerImageArticleCategoryEntityHashMap);
    }
};

}

【问题讨论】:

    标签: java rx-java observable


    【解决方案1】:

    不应重复使用Subscriber。它不起作用,因为它是 Subscription 并且一旦取消订阅它就完成了。

    如果您想重复使用它,请改用Observer

    source

    【讨论】:

    • 订阅者是观察者。公共抽象类 Subscriber 实现 Observer、Subscription
    • 当 subscribe() 作为参数调用时,观察者被包装到一个新的订阅者实例中,因此这个创建的订阅者不会被重用。
    【解决方案2】:

    您可以重复使用您的订阅者,您只需要从中创建一个实际的类。

    private static class MySubscriber extends Subscriber<List<ImageArticleCategoryEntity>> {...}
    
    Subscriber<> subscriber1 = new MySubscriber();
    Subscriber<> subscriber2 = new MySubscriber();
    

    你去吧。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-03-13
      • 1970-01-01
      • 1970-01-01
      • 2015-03-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多