Retrofit 2可以使用多个转换器但是bellow代码在我的项目中不起作用........
adapterBuilder = new Retrofit
.Builder()
.baseUrl(baseUrl)
.client(okClient)
.addConverterFactory(SimpleXmlConverterFactory.create())
.addConverterFactory(GsonConverterFactory.create());
答案 0 :(得分:0)
顺序很重要,也许你的转换器中的somthin冲突。
很难说,但实际上你可以通过注释指出哪个api应该使用哪个转换器。 比你更清楚哪个步骤不正确。
从这篇文章中了解更多。
https://proandroiddev.com/retrofit-advance-multi-converter-c675e9483801
答案 1 :(得分:0)
因此,正如Jintin所说,问题在于转换器的返回值。 在Retrofit中的功能中,它分别为请求和响应选择转换器:nextRequestBodyConverter和nextResponseBodyConverter
您有(来自nextRequestBodyConverter的代码与nextResponseBodyConverter相同):
int start = converterFactories.indexOf(skipPast) + 1;
for (int i = start, count = converterFactories.size(); i < count; i++) {
Converter.Factory factory = converterFactories.get(i);
Converter<?, RequestBody> converter =
factory.requestBodyConverter(type, parameterAnnotations, methodAnnotations, this);
if (converter != null) {
//noinspection unchecked
return (Converter<T, RequestBody>) converter;
}
}
您可以看到返回的转换器是否为!= null,它将使用它。 在您的情况下,对于我进入“ responseBodyConverter”和“ requestBodyConverter”的每种Type,SimpleXmlConverterFactory.create()都会返回一个有效的转换器。
为解决这个问题,我发现了两种方法:
1]编辑转换器的“ responseBodyConverter”和“ requestBodyConverter”方法,并在“类型”或“注释”与转换器所需的不匹配时返回“ null”。在其他地方,您应该返回转换器的“ ResponseBodyConverter”或“ RequestBodyConverter”实例(如果类型或注释与转换器所需的匹配)
例如,在转换器“ SimpleXmlConverterFactory”中,如果您具有注释“ @Xml”(或该转换器特定的任何东西),则如果在“注释”参数中没有此注释,则应返回“ null”这些方法。如果有一个返回值,则在“ responseBodyConverter”内部是一个“ ResponseBodyConverter”的实例,在“ requestBodyConverter”内部是一个“ RequestBodyConverter”的实例。
如果您无法编辑或扩展您的垂饰,那么您应该:
2]在您使用1个“ SimpleXmlConverterFactory”和“ GsonConverterFactory”的情况下,构建一个具有2个conveters作为属性的自定义转换器。 在构造函数中初始化转换器。 对于[1]点,您需要一种特定于所需转换器的类型或注释(例如,如果您有json响应,则应使用GsonConverter,如果有xml响应,则应使用XmlConverter)。
假设您已经在自定义转换器中定义了这些属性:
private GsonConverterFactory mGsonConverter;
private SimpleXmlConverterFactory mXmlConverter;
然后在方法“ responseBodyConverter”和“ requestBodyConverter”中执行以下操作:
@Override public Converter<ResponseBody, ?> responseBodyConverter(Type type, Annotation[] annotations, Retrofit retrofit) {
if(type or an annotation is specific of "GsonConverterFactory"){
return mGsonConverter.responseBodyConverter(type, annotations, retrofit);
} else {
return mXmlConverter.responseBodyConverter(type, annotations, retrofit);
}
}
与“ requestBodyConverter”相同,但是在这种情况下,您将:
if(type or an annotation is specific of "GsonConverterFactory"){
return mGsonConverter.requestBodyConverter(type, annotations, retrofit);
} else {
return mXmlConverter.requestBodyConverter(type, annotations, retrofit);
}
请记住,如果您有更多的conveters,则在
时应返回null。type or any annotations doesn't match both "GsonConverterFactory" and "SimpleXmlConverterFactory"
希望这对您有帮助:D
祝您编程愉快,祝您旅途愉快(: