使用多个转换器进行改造无法正常工作

时间:2017-01-13 06:48:08

标签: android retrofit2

Retrofit 2可以使用多个转换器但是bellow代码在我的项目中不起作用........

adapterBuilder = new Retrofit
           .Builder()
           .baseUrl(baseUrl)
           .client(okClient)
           .addConverterFactory(SimpleXmlConverterFactory.create())
           .addConverterFactory(GsonConverterFactory.create());

2 个答案:

答案 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

祝您编程愉快,祝您旅途愉快(: