如何在两个Observable(RxJava)之间重用订阅服务器

时间:2015-05-13 17:40:36

标签: java rx-java observable

为了不重复自己,我想在两个可观察对象之间重用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);
    }
};

}

2 个答案:

答案 0 :(得分:10)

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

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

source

答案 1 :(得分:0)

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

private static class MySubscriber extends Subscriber<List<ImageArticleCategoryEntity>> {...}

Subscriber<> subscriber1 = new MySubscriber();
Subscriber<> subscriber2 = new MySubscriber();

然后你去。