/MyOkHttpDemo

OkHttp常用方法demo

Primary LanguageKotlin

MyOkHttpDemo

OkHttp常用方法demo

先不考虑更细节的实现原理, 我们按照这一套模板也来自定义一个数据转换器, 这个转换器实现 ResponseBody 到 String 的转换

StringBodyConverter

class StringBodyConverter : Converter<ResponseBody, String> {
    companion object {
        val INSTANCE = StringBodyConverter()
    }

    override fun convert(value: ResponseBody): String? {
        return value.string()
    }
}

StringConverterFactory

class StringConverterFactory : Converter.Factory() {
    companion object {
        private val INSTANCE = StringConverterFactory()
        fun create(): StringConverterFactory { // 静态创建方法
            return INSTANCE
        }
    }

    // 只需要重写这个方法即可, 其他方法不用覆写
    override fun responseBodyConverter(
        type: Type,
        annotations: Array<out Annotation>,
        retrofit: Retrofit
    ): Converter<ResponseBody, *>? {
//        return super.responseBodyConverter(type, annotations, retrofit)
        return if (type === String::class.java) { // 只处理到String的转换
            StringBodyConverter.INSTANCE
        } else { //其他类型不处理返回null
            null
        }
    }
}

代码中使用, 示例如下:

  val retrofit1 = Retrofit.Builder()
      .baseUrl(baseUrl)
      // 这里需要注意:自定义的Converter一定要放在官方提供的Converter前面
      // addConverterFactory 是有先后顺序的, 多个 Converter 都支持同一种类型的转换的话, 只会是第一个生效, 后面源码会分析到
      .addConverterFactory(StringConverterFactory.create())
      .addConverterFactory(GsonConverterFactory.create())
      .build()

类似的还有其他转换都可以自定义并添加进工场集,