2017-06-09 1 views
0

Compte tenu de la chaîne suivante:doOnNext() n'a jamais appelé

public Observable<List<PoiCollection>> findPoiCollectionsByUserId(Integer userId) { 
    return findUserGroupsByUserId(userId) 
      .flatMapIterable(
        userGroups -> userGroups) 
      .flatMap(
        userGroup -> findPoiCollectionToUserGroupsByUserGroupId(userGroup.getId())) 
      .flatMapIterable 
        (poiCollectionToUserGroups -> poiCollectionToUserGroups) 
      .flatMap(
        poiCollectionToUserGroup -> { 
         Observable<PoiCollection> poiCollectionById = findPoiCollectionById(poiCollectionToUserGroup.getPoiCollectionId()); 
         return poiCollectionById; 
        }) 
      .toList() 
      .doOnNext(poiCollections -> { 
       Timber.d("poi-collections from DB:", poiCollections); 
       for(PoiCollection collection : poiCollections) { 
        Timber.d("collection:", collection); 
       } 
      }) 
      .doOnError(throwable -> 
        Timber.e("error fetching poi-collections for user from DB")); 
} 

Ce qui est invoqué comme ceci:

Observable<List<PoiCollection>> fromDB = databaseHelper.findPoiCollectionsByUserId(id); 

fromDB.subscribeOn(Schedulers.io()) 
     .observeOn(AndroidSchedulers.mainThread()) 
     .subscribe(
       poiCollections -> { 
        Activity activity = (Activity) getView(); 
          Intent intent = new Intent(activity, PoiCollectionsActivity.class); 
        intent.putExtra("poi_collections", (Serializable) poiCollections); 
        activity.startActivity(intent); 
        activity.finish(); 
       }, 
       throwable -> { 
        if (throwable instanceof SocketTimeoutException) { 
         getView().showInternetDialog(); 
        } 
       }); 

Je me demande pourquoi ni doOnNext(...) ni doOnError(...) est invoqué. La chaîne est en cours d'exécution jusqu'à toList(), donc les lignes ci-dessous sont en cours d'exécution, il s'arrête juste après.

poiCollectionToUserGroup -> { 
      Observable<PoiCollection> poiCollectionById = findPoiCollectionById(poiCollectionToUserGroup.getPoiCollectionId()); 
      return poiCollectionById; 
     }) 

Un point d'arrêt à poiCollectionById et un autre à l'intérieur findPoiCollectionById(...) montrent clairement, le résultat est d'être tiré par les cheveux de DB avec succès!

Alors, qu'est-ce qui empêche l'appel de doOnNext(...)? J'appelle clairement subscribe(...) sur l'observable. La chaîne de mappage s'exécute jusqu'à toList(). Je ne vois jamais le code courir dans doOnError(...), et je ne cours jamais dans la partie Action<Throwable> de subscribe(...). Doit avoir quelque chose à voir avec toList().

+0

Obtient-on des éléments émis dans onNext() lors de l'abonnement? – Ritesh

+0

pouvez-vous mettre doOnNext() avant toList() et essayez. – Ritesh

+0

Oui, je peux, je m'attendais aussi bien. Le problème est l'invocation de toList(). Cependant, je dois être capable de créer une liste. Inutile autrement. –

Répondre

0

Ce n'est pas une réponse à ma question, mais une solution à mon problème

public Observable<List<PoiCollection>> findPoiCollectionsByUserId(Integer userId) { 

    List<PoiCollection> poiCollections = new ArrayList<>(); 

    findUserGroupsByUserId(userId) 
      .flatMap(Observable::from) 
      .flatMap(userGroup -> findPoiCollectionToUserGroupsByUserGroupId(userGroup.getId())) 
      .flatMap(Observable::from) 
      .flatMap(poiCollectionToUserGroup -> findPoiCollectionById(poiCollectionToUserGroup.getPoiCollectionId())) 
      .doOnNext(collection -> poiCollections.add(collection)) 
      .subscribe(); 

    return Observable.just(poiCollections); 
} 

Je souhaite vraiment que j'avais pas créer le ArrayList, mais plutôt faire quelque chose comme la méthode collect(Collectors.toList()) de Java 8 Stream API en utilisant rxJavas toList().