2017-09-25 3 views
1

Conversion code RxJava1 à RXJava2 Donner cette erreur, ne sais pas ce que je fais malRxJava1 à Rxjava2 Migration Erreur

aucune instance (s) de la variable de type (s) R existe de telle sorte que seul> est conforme à ObserableSource

API Appel

@GET("/search/users?per_page=2") 
Observable<UsersList> searchGithubUsers(@Query("q") String searchTerm); 

@GET("https://stackoverflow.com/users/{username}") 
Observable<User> getUser(@Path("username") String username); 

RxJAva1:

public Observable<List<User>> searchUsers(final String searchTerm) { 
     return Observable.defer(() -> githubUserRestService.searchGithubUsers(searchTerm).concatMap(
       usersList -> Observable.from(usersList.getItems()) 
         .concatMap(user -> githubUserRestService.getUser(user.getLogin())).toList())) 
       .retryWhen(observable -> observable.flatMap(o -> { 
        if (o instanceof IOException) { 
         return Observable.just(null); 
        } 
        return Observable.error(o); 
       })); 
    } 

RXJava2

public Observable<List<User>> searchUsers(final String searchTerm) { 
     return Observable.defer(() -> githubUserRestService.searchGithubUsers(searchTerm).concatMap(
       usersList -> Observable.fromIterable(usersList.getItems()) 
         .concatMap(user -> githubUserRestService.getUser(user.getLogin())).toList())) 
       .retryWhen(observable -> observable.flatMap(o -> { 
        if (o instanceof IOException) { 
         return Observable.just(null); 
        } 
        return Observable.error(o); 
       })); 
    } 

Répondre

2

toList retours Single 2.x; vous devez appliquer toObservable() après. Notez également que Observable.just(null) est interdit: nulls ne sont généralement pas autorisés avec RxJava 2.

Observable<List<User>> searchUsers(final String searchTerm) { 
    return Observable.defer(() -> 
     githubUserRestService 
      .searchGithubUsers(searchTerm) 
      .concatMap(usersList -> 
       Observable.fromIterable(usersList.getItems()) 
        .concatMap(user -> 
         githubUserRestService 
         .getUser(user.getLogin())) 
         .toList() 
         .toObservable() 
        ) 
      ) 
      .retryWhen(observable -> 
       observable.flatMap(o -> { 
        if (o instanceof IOException) { 
         return Observable.just(0); 
        } 
        return Observable.error(o); 
       }) 
      ) 
     ); 
} 
+0

toList() toObservable() fixe la question, mais en ajoutant Observable.. juste (0) donnant une autre erreur, "mauvais type de retour dans l'expression lambda: Observable ne peut pas être converti en ObservableSource " – Sam

+0

Soit le changer en 'juste ((Objet) 0)' ou '. erreur (o) ' – akarnokd

+0

Merci beaucoup pour l'explication, si vous pouvez sauvegarder cette ligne avec un lien de référence serait génial pour quiconque se posant sur cette question." Notez aussi que Observable.just (null) est interdite: les nulls ne sont généralement pas autorisé avec RxJava 2. " – Sam

0

Essayez d'utiliser RxJava2CallAdapterFactory:

Retrofit retrofit = new Retrofit.Builder() 
    .baseUrl("https://example.com/") 
    .addCallAdapterFactory(RxJava2CallAdapterFactory.create()) 
    .build(); 
+0

mais cette erreur de compilation à venir dans Rxjava2 lors de la combinaison avec concatMap opérateur – Sam