2017-07-13 6 views
-3

J'utilise RxJava dans un job evernote pour envoyer des données à l'API. Ce code fonctionnait très bien jusqu'à maintenant. Le problème est quelque part dans le .filter Je pense qu'il est même pas apprendre à getApiService().createReport(requestModel) méthode à moins que des photos dans le modèle (alors report.getImages() n'est pas null.RxJava .filter bloque l'envoi de données par d'autres codes à l'API

public static Observable<Report> createReport(CreateReportModel model) { 
    return Observable.just(model) 
      .filter(report -> report.getImages() != null) 
      .flatMap(report -> { 
       return Observable.from(report.getImages()) 
         .map(photoModel -> { 
          return photoModel; 
         }) 
         .filter(photoModel -> photoModel.hasImage()) 
         .filter(photoModel -> photoModel.getImage().exists()) 
         .flatMap(photoModel -> uploadFile(photoModel)).toList(); 
      }) 
      .map(photoModels -> model) 
      .flatMap(requestModel -> { 
       return getApiService().createReport(requestModel) 
         .map(response -> { 
          return response; 
         }); 
      }); 
} 

Cette fonction est appelée dans ce code

Et ici, il va à Result.SUCCESS mais la réponse n'est pas obtenir et le rapport n'est pas créé sur back end.J'inquiète est que ce code fonctionnait très bien il y a quelques jours, et sans aucun changement il a arrêté

[EDIT]

J'ai cette fonction qui est appelée dans le premier flatMap, et elle est utilisée pour envoyer les photos.

@NonNull 
private static Observable<? extends CreatePalletPhotoModel> uploadPalletFile(CreatePalletPhotoModel photo) { 
    MultipartBody.Part fileBody = Paperless.createFileBody(photo.getImage()); 
    return Paperless.getApiService().uploadPalletPhoto(fileBody) 
      .map(upload -> { 
       photo.setPalletStatus(upload.getPalletStatus()); 
       photo.setImage(upload.getImage()); 
       return photo; 
      }); 
} 
+0

alors qu'est-ce qui ne fonctionne pas exactement? Vous avez raison de dire que le service api ne sera pas appelé si les éléments sont filtrés. – hgrey

+0

S'il n'y a pas d'images alors le premier '.flatMap' ne devrait pas s'exécuter (c'est pour envoyer les photos) mais le second' .flatMap' est pour l'envoi du rapport et ça devrait marcher (ça ne marche pas). 'return getApiService(). createReport (requestModel)' n'est jamais appelé. – Claire

Répondre

0

S'il n'y a aucun rapport après filter, rien ne sera exécuté. Pensez à enlever

.map(photoModels -> model) 

et finir la première observable là (vous devez souscrire) et à nouveau commencer par

Observable.just(model).flatMap(requestModel -> { 
      return getApiService().createReport(requestModel) 
        .map(response -> { 
         return response; 
        }); 
     }); 

qui veillera à ce que getApiService appel est toujours exécuté.

+0

Je suis un peu nouveau à RxJava pouvez-vous m'aider avec la façon de vous abonner et comment cela va-t-il fonctionner? – Claire

+0

le plus simple est juste de réécrire le premier bloc comme un java normal pour la boucle – hgrey

+0

J'ai modifié la question. Je ne comprends pas. Comment puis-je réécrire le premier bloc. Et dans l'édition il y a une fonction pour envoyer des photos, où puis-je appeler cette fonction. S'il vous plaît dites-moi plus d'informations car je ne comprends pas très bien ce que vous voulez dire. Merci – Claire