在Retrofit RxJava嵌套的observables中的循环推理

时间:2016-05-12 13:34:50

标签: rx-java retrofit2 rx-android

rxJava中的新功能我正在努力通过嵌套改进的Observable来获得Observable。 在代码块.map(userResponse -> { data.put final Intent resd = new Intent(); resd.putExtras(data); return (Intent)resd; });

我收到循环推理错误。 当我尝试编译时,我得到一个奇怪的消息,我不太明白:

  

错误:(52,21)错误:不兼容的类型:无法推断类型变量R   (参数不匹配; lambda表达式中的错误返回类型   Intent无法转换为Observable)   其中R,T是类型变量:   R扩展方法flatMap中声明的Object(Func1>)   T扩展了在Observable类中声明的Object

这是代码:

public Observable<Intent> createUser(final String email) {
    Bundle data = new Bundle();
    return mWebservice.clientAuth("myFakeClientId") //returns an Observable<AccessToken>
            .map(clientTokenObject -> {
                String clientToken = clientTokenObject.accessToken;
                Observable<Response<User>> userResponseObservable = mWebservice.createAccount(email);
                Observable<Intent> resultObs =  userResponseObservable
                                .map(userResponse -> {
                                    final Intent resd = new Intent();
                                    resd.putExtras(data);
                                    return (Intent)resd;
                                });
                        return resultObs;
                    });
}

1 个答案:

答案 0 :(得分:3)

您的映射是错误的。你需要像

这样的东西
public Observable<Intent> createUser(final String email) {

    return mWebservice.clientAuth("myFakeClientId") //returns an Observable<AccessToken>
                      .map(clientTokenObject  -> clientTokenObject.accessToken)
                      .flatMap(accessToken -> { mWebservice.createAccount(email).
                                                       .map(userResponse -> {
                                                                final Intent resd = new Intent();
                                                                Bundle data = new Bundle();
                                                                resd.putExtras(data);
                                                                return (Intent)resd;
                                                            })});

}