每个应用程序都会面临下载文件的问题,昨天我就遇到了程序下载新版安装包的问题,以前都是用封装过的下载工具类,但此次项目用的是retrofit网络框架+模块化的项目结构+MVP的设计模式,为了不破坏项目的统一性,我决定还是改用retrofit实现网络下载请求。于是我想到既然可以通过添加GsonConverterFactory实现把返回值转化成json数据,那么同样可以通过添加自定义的FileConvertFactory实现把返回值转化成file的目的。
那么这个FileConvertFactory该怎么写呢?既然不知道就找一个参考
关于GsonConverterFactory
public final class GsonConverterFactory extends Converter.Factory {
/**
* Create an instance using a default {@link Gson} instance for conversion. Encoding to JSON and
* decoding from JSON (when no charset is specified by a header) will use UTF-8.
*/
public static GsonConverterFactory create() {
return create(new Gson());
}
/**
* Create an instance using {@code gson} for conversion. Encoding to JSON and
* decoding from JSON (when no charset is specified by a header) will use UTF-8.
*/
@SuppressWarnings("ConstantConditions") // Guarding public API nullability.
public static GsonConverterFactory create(Gson gson) {
if (gson == null) throw new NullPointerException("gson == null");
return new GsonConverterFactory(gson);
}
private final Gson gson;
private GsonConverterFactory(Gson gson) {
this.gson = gson;
}
@Override
public Converter<ResponseBody, ?> responseBodyConverter(Type type, Annotation[] annotations,
Retrofit retrofit) {
TypeAdapter<?> adapter = gson.getAdapter(TypeToken.get(type));
return new GsonResponseBodyConverter<>(gson, adapter);
}
@Override
public Converter<?, RequestBody> requestBodyConverter(Type type,
Annotation[] parameterAnnotations, Annotation[] methodAnnotations, Retrofit retrofit) {
TypeAdapter<?> adapter = gson.getAdapter(TypeToken.get(type));
return new GsonRequestBodyConverter<>(gson, adapter);
}
}
GsonConverterFactory的源码很简单易懂。GsonConverterFactory继承自Converter.Factory,实现了其中requestBodyConverter和responseBodyConverter方法,从名字可看出一个是对请求数据做操作,一个是对响应数据做操作。既然如此我们也照猫画虎。
先创建factory目录再创建FileConvertFactory文件
class FileConvertFactory : Converter.Factory() {
companion object {
fun create(): FileConvertFactory {
return FileConve