Retrofit2自定义Converter.Factory

一般的我们会使用GsonConverterFactory,但是总会有一些奇葩要求困扰着我们。
1、首先得我们需要创建一个转换工厂类继承自系统的Converter.Factory;
2、根据响应实体类型,来对responseBody进行不同的转换;
3、创建xxConverter< T >继承自Converter< ResponseBody, T >,在重写的converter< T >方法中完成我们的转换。

public class MyConverterFactory extends Converter.Factory {
    private static final String TAG = "debug";
    private final Gson gson;

    public static MyConverterFactory create() {
        return create(new 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;
    }

    @Override
    public Converter?> responseBodyConverter(Type type, Annotation[] annotations, Retrofit retrofit) {
        TypeAdapter> adapter = gson.getAdapter(TypeToken.get(type));
        //判断响应实体类型是否是我们需要特殊处理的特殊类型(此处以String类型)
        if (type == String.class) {
            //创建xxConverter来 进行特殊转换
            return new MyResponseConverter(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();
            MovieDataBean movieDataBean = gson.fromJson(response, MovieDataBean.class);
//            return (T) response;
            return (T) App.getInstance().getResources().getString(R.string.test_string);
        }

    }

}

自定义好转换器工厂类之后我们就可以使用它了

 retrofit = new Retrofit.Builder()
                .client(client.build())
                //添加我们的自定义转换器
                .addConverterFactory(MyConverterFactory.create())
                .addConverterFactory(GsonConverterFactory.create()) 
                .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
                .baseUrl(BASE_URL)
                .build();
  • 需要注意的是添加转换器工厂的顺序,先添加的先被使用;
  • 转换器工厂在源码里会被添加到集合中。

你可能感兴趣的:(android学习笔记)