私はのviewmodelにこのテーマを持っている:なぜこのコードではoncompletedは呼び出されませんか?
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());
}
});
}
私はこのようなビューバインド:
viewModel.newArticleSubject()
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new ArticleSubscriber());
をそして、これは私の加入者である:
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
}
}
onCompleted
が呼び出されることはありませんが、 onError
およびonNext
があります。どうして? dataModel.getArticleById(articleId)
の内部にはsubscriber.onCompleted();
が呼び出されます。
'onError'が呼び出された場合、' onComplete'は呼び出されません。それは設計によるものです。 –
つまり、失敗した場合は、onErrorが呼び出されます。しかし、すべてがOKであれば、onCompletedは –
ではありません。それは 'PublishSubject'なので、誰かが' articleSubject'でonCompleteを呼び出すことはありません。 –