Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

}

like image 377
ZakTaccardi Avatar asked May 13 '15 17:05

ZakTaccardi


1 Answers

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

like image 80
Egor Neliuba Avatar answered Nov 11 '22 00:11

Egor Neliuba