美文网首页
retrofit2自定converter要点

retrofit2自定converter要点

作者: liboxiang | 来源:发表于2018-10-18 10:42 被阅读55次
接口定义中要写明转换类型 TYNetworkingRespondModel
public class TYNetworkingRespondModel {
    private String Msg;
    private int Code;
    private Map Data;
}
@GET("app/MobileApp.ashx")
    Call<TYNetworkingRespondModel> createGetRequest(@Query("Module") String module,@Query("Param") String param);
自定义Factory中处理转换
public class MyConverterFactory extends Converter.Factory {
    public static MyConverterFactory create() {
        return create(new Gson());
    }

    private final Gson gson;

    public static MyConverterFactory create(Gson gson) {
        return new MyConverterFactory(gson);
    }

    private MyConverterFactory(Gson gson) {
        if (gson == null) throw new NullPointerException("gson == null");
        this.gson = gson;
    }

//    @javax.annotation.Nullalbe
    @Override
    public Converter<ResponseBody, ?> responseBodyConverter(Type type, Annotation[] annotations, Retrofit retrofit) {
        TypeAdapter<?> adapter = gson.getAdapter(TypeToken.get(type));
        //判断响应实体类型是否是我们需要特殊处理的特殊类型(此处以String类型)
        if (type == TYNetworkingRespondModel.class) {
            //创建xxConverter来 进行特殊转换
            return new MyResponseConverter<TYNetworkingRespondModel>(gson);
        } else {
            //其它类型我们不处理,返回null就行 会交给后面的解析器来解析
            return null;
        }
    }

    private class MyResponseConverter<T> implements Converter<ResponseBody, T> {
        private final Gson gson;

        MyResponseConverter(Gson gson) {
            this.gson = gson;
        }

        @Override
        public T convert(ResponseBody value) throws IOException {
            //在此处进行我们的转换
            String response = value.string();
            TYNetworkingRespondModel movieDataBean = gson.fromJson(response, TYNetworkingRespondModel.class);
//            return (T) response;
            return (T) movieDataBean;
        }

    }
}
具体使用
Retrofit retrofit = new Retrofit.Builder()
                    .baseUrl(TYStaticDefine.STR_BASE_URL)
                    .addConverterFactory(MyConverterFactory.create())
                    .addConverterFactory(GsonConverterFactory.create())
                    .build();
更复杂的转化可以通过自定义JsonDeserializer实现

详情见:http://www.javacreed.com/gson-deserialiser-example/

相关文章

网友评论

      本文标题:retrofit2自定converter要点

      本文链接:https://www.haomeiwen.com/subject/zijjzftx.html