提问者:小点点

无法为类示例创建调用适配器。简单


我正在使用带有SimpleXml的改造2.0.0-beta1。我想从REST服务中检索一个简单(XML)资源。使用SimpleXML编组/解组简单对象工作正常。

使用此代码时(转换为2.0.0之前的代码):

final Retrofit rest = new Retrofit.Builder()
    .addConverterFactory(SimpleXmlConverterFactory.create())
    .baseUrl(endpoint)
    .build();
SimpleService service = rest.create(SimpleService.class);
LOG.info(service.getSimple("572642"));

服务:

public interface SimpleService {

    @GET("/simple/{id}")
    Simple getSimple(@Path("id") String id);

}

我得到了这个例外:

Exception in thread "main" java.lang.IllegalArgumentException: Unable to create call adapter for class example.Simple
    for method SimpleService.getSimple
    at retrofit.Utils.methodError(Utils.java:201)
    at retrofit.MethodHandler.createCallAdapter(MethodHandler.java:51)
    at retrofit.MethodHandler.create(MethodHandler.java:30)
    at retrofit.Retrofit.loadMethodHandler(Retrofit.java:138)
    at retrofit.Retrofit$1.invoke(Retrofit.java:127)
    at com.sun.proxy.$Proxy0.getSimple(Unknown Source)

我缺少什么?我知道用Call包装返回类型是可行的。但是我希望服务将业务对象作为类型返回(并且在同步模式下工作)。

更新

在按照不同答案的建议添加了额外的依赖和. addCallAdapterFactory(RxJavaCallAdapterFactory.create())后,我仍然得到这个错误:

Caused by: java.lang.IllegalArgumentException: Could not locate call adapter for class simple.Simple. Tried:
 * retrofit.RxJavaCallAdapterFactory
 * retrofit.DefaultCallAdapter$1

共3个答案

匿名用户

在静态编程语言和协程的情况下,这种情况发生在我从CoroutineScope(Dispatchers.IO)调用这个函数时忘记将api服务函数标记为挂起时:

用法:

    val apiService = RetrofitFactory.makeRetrofitService()

    CoroutineScope(Dispatchers.IO).launch {

        val response = apiService.myGetRequest()

        // process response...

    }

爱彼迎

interface ApiService {

       @GET("/my-get-request")
       suspend fun myGetRequest(): Response<String>
}

匿名用户

简短的回答:返回调用

看起来Retrofit 2.0正在尝试找到一种为您的服务接口创建代理对象的方法。它希望您这样写:

public interface SimpleService {
    @GET("/simple/{id}")
    Call<Simple> getSimple(@Path("id") String id);
}

但是,当您不想返回Call时,它仍然希望发挥良好的灵活性。为了支持这一点,它有CallAdapter的概念,它应该知道如何适应Call

RxJavaCallAdapterFactory的使用仅在您尝试返回rx. Watable时有用

最简单的解决方案是按照Retrofit的期望返回Call。如果您确实需要,您也可以编写CallAdapter. Factory

匿名用户

添加依赖项:

compile 'com.squareup.retrofit:retrofit:2.0.0-beta1'
compile 'com.squareup.retrofit:adapter-rxjava:2.0.0-beta1'
compile 'com.squareup.retrofit:converter-gson:2.0.0-beta1'

以这种方式创建适配器:

Retrofit rest = new Retrofit.Builder()
    .baseUrl(endpoint)
    .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
    .addConverterFactory(SimpleXmlConverterFactory.create())
    .build();

addCallAdapterFactory()addConverterFactory()都需要调用。

服务:

public interface SimpleService {

    @GET("/simple/{id}")
    Call<Simple> getSimple(@Path("id") String id);

}

修改简单调用