关于sjoner/khttp的使用详解
概述
记录些关于sjoner/khttp源码使用时踩的坑
正文
1.什么是sjoner/khttp
sjoner/khttp是使用过的对okHttp3网络框架进行kotlin再封装中比较好用的一个第三方插件,由于该插件的作者君上传完后也就没有了后续的更新,所以本人建议要使用的话最好下载源码导入比较好,便于根据个人实际需要进行相应的修改。
2.导入插件代码时需要注意的坑
对于直接gradle进行implementation的,由于github上有详细的导入教程,在此不再赘述。而使用导入的同学,在导入成功并写好Demo运行时也许会发现以下错误:
这是因为在khttp的gradle中使用的api 'org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.3.21'
,而如果你的module 中使用了 Java1.8,那必须在app.gradle的android中添加以下参数,否则就会报以上的错误:
compileOptions {//如果你的module 中使用了 Java1.8,那必须添加以下参数
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
3.运行Demo时需要注意的坑
当你代码写好,准备运行的时候,也许会发现,你的程序崩溃了,出现了以下的崩溃日志:
无法转换成相应的实体,这是因为源码中的响应转换器,如下图
源码中对ResponseBody并没有做处理,而是直接输出了,而ResponseBody无法直接转换成我们自定义的响应实体,所以会抛异常。在此,我们需要修改DefaultResponseConverter或自定义自己的相关转换器对返回值进行处理,比如这样:
/**
* 响应转换器
*/
class HttpResponseConverter: Converter<ResponseBody?, Any> {
/**
* @param value 返回值
* @param returnType 返回类型
*/
override fun convert(value: ResponseBody?, returnType: Type): Any {
return gSon.fromJson(value?.string()?:"", returnType)
}
}
class BaseApplication: Application() {
companion object {
lateinit var instance: BaseApplication
private set
}
override fun onCreate() {
super.onCreate()
instance = this
gSon = Gson()
initRetrofit {
baseUrl("https://api.github.com/")
responseConverter = HttpResponseConverter()
debug = true
}
}
}
var Any.gSon: Gson by Delegates.notNull()
PS:implementation 'com.google.code.gson:gson:2.8.1'
后记
ok,暂时就这么多,其他的往上加就行,没难度,比如处理请求数据;数据加密和解密,大胆修改源码,还能给你玩坏不成。
——End——