Retrofit无法创建呼叫适配器

时间:2015-09-05 10:12:32

标签: android retrofit rx-java retrofit2

这是我的UserService接口

app.controller('single-item', ['$scope', '$routeParams', 'productService', function ($scope, $routeParams, productService){
    $scope.product = productService.getProductAt($routeParams.item);

}]);

在我打电话的活动中

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

我做错了什么?

Gradle:

java.lang.IllegalArgumentException: Unable to create call adapter for class java.lang.String
    for method UserService.loginUser

2 个答案:

答案 0 :(得分: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。

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

答案 1 :(得分:0)

Aleksei,如果您需要最简单的解决方案来从Retrofit库获取String结果,那么您必须执行以下几次调用:

  1. 起初,Gradle dependecies:

    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(*all your params*).execute().body();
    
  5. 我希望,解决方案很明确,并显示简单的字符串接收方法。如果您需要其他数据解析器,请查看此处的转换器列表Retrofit CONVERTERS