简体   繁体   中英

How can I reuse a Subscriber between two Observables (RxJava)

In order to not repeat myself, I want to re-use a Subscriber variable between two observables. How do you do accomplish this? My current code below does not work, because after the subscriber is used once, it is unsubscribed and no longer works again. If I new a Subscriber instead of reusing a variable, my subscription works. I don't want to write the same code twice, if possible.

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);
    }
};

}

A Subscriber should not be reused. It will not work because it is a Subscription and once unsubscribed it is done.

Use an Observer instead if you want to reuse it.

source

You can reuse your subscriber, you just need to create an actual class out of it.

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

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

And there you go.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM