2016-10-24 2 views
4

Ich habe dieses Thema in dem Viewmodel:Warum onCompleted wird in diesem Code nicht aufgerufen?

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

ich die Ansicht wie folgt zu binden:

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

Und das ist mein Teilnehmer:

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 nie genannt wird, aber onError und onNext sind. Warum? Inside dataModel.getArticleById(articleId), subscriber.onCompleted(); heißt.

+4

Wenn 'onError' aufgerufen wird,' onComplete' wird * nicht * aufgerufen werden; das ist von Entwurf. –

+0

Ich meine, falls es scheitert, wird onError aufgerufen. Aber wenn alles in Ordnung ist, ist onCompleted nicht –

+3

Da es sich um ein 'PublishSubject' handelt, ruft jemand onComplete nicht auf dem' articleSubject' auf. –

Antwort

8

Wie man aus dem Bild in PublishSubject the documentation schließen kann:

enter image description here

PublishSubject sowie andere *Subjects wird Live bis somone onError oder onCompleted nennt. In der Tat sind sie nicht anders in dieser Angelegenheit von jedem anderen Observable.

Die newArticleSubject erstellt neue PublishSubject und flache Karten jedes Element emittiert zu einer anderen beobachtbaren. Falls getArticleById mit einem Fehler endet, endet die von flatMap zurückgegebene Observable ebenfalls. Wenn jedoch getArticleById ausstrahlt und normal endet, wird flatMap mit fortgesetzt, warten Sie auf für neue Elemente, die von articleSubject ausgegeben werden. Wenn Sie explizit enden müssen articleSubject rufen Sie einfach articleSubject.onCompleted()

+0

Vielen Dank. Ich verstehe jetzt :) –

Verwandte Themen