Why isn't onCompleted called in this code?

I have this question in viewmodel:

private PublishSubject<String> articleSubject;

public Observable<Article> newArticleSubject() {
    articleSubject = PublishSubject.create();
    return articleSubject.flatMap(new Func1<String, Observable<Article>>() {         
        @Override
        public Observable<Article> call(String articleId) {
            return dataModel.getArticleById(articleId).subscribeOn(Schedulers.newThread());
        }
    });
}

I snap the view as follows:

viewModel.newArticleSubject()
    .observeOn(AndroidSchedulers.mainThread())
    .subscribe(new ArticleSubscriber());

And this is my subscriber:

 private class ArticleSubscriber extends Subscriber<Article> {

        @Override
        public void onCompleted() {
            Log.d("test", "This is not ever printed");
        }

        @Override
        public void onError(Throwable e) {
            //do stuff
        }

        @Override
        public void onNext(Article article) {
            //do stuff
        }
}

onCompletednever called, but onErroralso onNext. What for? Inside dataModel.getArticleById(articleId)called subscriber.onCompleted();.

+4
source share
1 answer

How can I make from an image available in the PublishSubjectdocumentation :

enter image description here

PublishSubjectas well as others *Subjectswill live until somone calls onErroror onCompleted. In fact, they are no different in this matter from any other Observable.

newArticleSubject PublishSubject , . , getArticleById , , flatMap, . , getArticleById flatMap articleSubject. articleSubject, articleSubject.onCompleted()

+8

Source: https://habr.com/ru/post/1658716/


All Articles