2017-09-25 140 views
1

转换RxJava1代码RXJava2给予这个错误,不知道我做错了RxJava1到Rxjava2迁移错误

无类型变量(一个或多个)R的实例(S)存在,使得单>符合ObserableSource

API调用

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

回答

2

toList回报Single在2.X;之后你必须申请toObservable()。还要注意的是Observable.just(null)禁止:空一般不允许与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()结合在Rxjava2未来这个编译错误toObservable()固定问题,但增加可观测。只是(0)给出另一个错误,“lambda表达式中的错误返回类型:Observable 无法转换为ObservableSource <?extends Integer>” – Sam

+0

将其更改为“just((Object)0)'或'。 错误(o)' – akarnokd

+0

非常感谢您的解释,如果您可以通过一些引用链接来支持此行,那么对于登陆此问题的任何人都会很有帮助。“还要注意Observable.just(null)是被禁止的:null一般不会允许与RxJava 2“。 – Sam

0

尝试使用RxJava2CallAdapterFactory

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

但与concatMap操作 – Sam