2016-10-24 9 views
4

私はの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();が呼び出されます。

+4

'onError'が呼び出された場合、' onComplete'は呼び出されません。それは設計によるものです。 –

+0

つまり、失敗した場合は、onErrorが呼び出されます。しかし、すべてがOKであれば、onCompletedは –

+3

ではありません。それは 'PublishSubject'なので、誰かが' articleSubject'でonCompleteを呼び出すことはありません。 –

答えて

8

PublishSubject the documentationに利用可能な画像から結論付けることができるように:SomoneのはonError又はonCompleted呼び出し

enter image description here

PublishSubjectならびに他*Subjects意志ライブ

まで。実際には彼ら はこの問題に関して異ならない他の Observableからです。

newArticleSubjectは新しいPublishSubjectフラットマップ異なる観測可能に放出されたすべてのアイテムを作成します。 getArticleByIdがエラーで終了する場合は、flatMapによって返されたオブザーバブルも終了します。しかし、getArticleByIdが正常に発光して完了した場合、flatMapは、articleSubjectによって放出される新しいアイテムについては、を待ちます。明示的にarticleSubjectを終了する必要がある場合articleSubject.onCompleted()

+0

ありがとうございます。今、私は分かる :) –

関連する問題