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()
.
Obtient-on des éléments émis dans onNext() lors de l'abonnement? – Ritesh
pouvez-vous mettre doOnNext() avant toList() et essayez. – Ritesh
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. –