2017-09-25 139 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