Retrofit无法创建调用适配器

8

这是我的UserService接口

 @GET(Constants.Api.URL_LOGIN)
    String loginUser(@Field("email") String email, @Field("password") String pass, @Field("secret") String secret, @Field("device_id") String deviceid, @Field("pub_key") String pubkey, @Field("device_name") String devicename);

在我调用的活动中,我正在执行以下操作:
retrofit = new Retrofit.Builder()
                .baseUrl(Constants.Api.URL_BASE)
                .addConverterFactory(GsonConverterFactory.create())
                .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
                .build();
service = retrofit.create(UserService.class);
String status = service.loginUser(loginedt.getText().toString(), passwordedt.getText().toString(), secret, device_id, pub_key, device_name);

这会导致一个异常。
java.lang.IllegalArgumentException: Unable to create call adapter for class java.lang.String
    for method UserService.loginUser

What am I doing wrong?

Gradle :

compile 'com.squareup.retrofit:retrofit:2.+'
compile 'com.squareup.retrofit:adapter-rxjava:2.0.0-beta1'
compile 'com.squareup.retrofit:converter-gson:2.0.0-beta1'
2个回答

13

由于您已经包含了 addCallAdapterFactory(RxJavaCallAdapterFactory.create()),因此您想要使用 Observable 来管理您的调用。在您的接口中,明确给出参数化的 Observable 而不是一个 Call --

@GET(Constants.Api.URL_LOGIN)
    Observable<String> loginUser(@Field("email") String email, @Field("password") String pass, @Field("secret") String secret, @Field("device_id") String deviceid, @Field("pub_key") String pubkey, @Field("device_name") String devicename);

然后您的service方法为您创建可观察对象,您可以订阅它们或将其用作可观察管道的起点。

Observable<String> status = service.loginUser(loginedt.getText().toString(), passwordedt.getText().toString(), secret, device_id, pub_key, device_name);
status.subscribe(/* onNext, onError, onComplete handlers */);

0
Aleksei,如果你需要从Retrofit库中获取字符串结果的最简单解决方案,那么你需要进行几次调用:
  1. 首先,Gradle 依赖项:

    compile 'com.squareup.retrofit2:retrofit:2.0.0-beta4'
    compile 'com.squareup.retrofit2:converter-scalars:2.0.0-beta4'
    
  2. 修改后的 UserService 接口:

    @GET(Constants.Api.URL_LOGIN)
    Call< String> loginUser(@Field("email") String email, @Field("password") String pass, @Field("secret") String secret, @Field("device_id") String deviceid, @Field("pub_key") String pubkey, @Field("device_name") String devicename);
    
  3. 服务客户端创建代码:

    static UserService SERVICE_INSTANCE = (new Retrofit.Builder()
            .baseUrl(Constants.Api.URL_BASE)
            .addConverterFactory(ScalarsConverterFactory.create())
            .build()).create(UserService.class);    
    
  4. 调用请求:

    SERVICE_INSTANCE.loginUser(*所有参数*).execute().body();
    

我希望解决方案清晰明了,并展示了简单的字符串接收方法。如果您需要其他数据解析器,请在这里查看转换器列表Retrofit CONVERTERS


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接