- 通过
OkHttp
的拦截器实现的下载、上传进度监听功能,同时支持OkHttp
和Retrofit
。
- 在构建
Request
对象时,构建一个DlProgressCallback
实例,并通过tag(Class<T>, T)
方法添加到Request.Builder
中。
- 在下载文件或请求网络时,服务器数据传输到本地时会调用该回调实例的
update
方法,参数是一个float
值,可通过(progress * 100).toInt()
来得到下载进度的百分比。
- 注意:
update
方法运行在子线程中(与Interceptor.intercept
方法的调用线程一致)。
val request = Request.Builder()
.tag(DlProgressCallback::class.java, DlProgressCallback { progress ->
val percent = (progress * 100).toInt()
TODO("处理下载进度监听")
})
...
- 上传进度则构建一个
UpProgressCallback
实例,并通过tag(Class<T>, T)
方法添加到Request.Builder
中。
- 在上传文件或请求网络时,本地数据传输到服务器时会调用该回调实例的
update
方法,参数是一个float
值,可通过(progress * 100).toInt()
来得到下载进度的百分比。
- 注意:
update
方法运行在子线程中(与Interceptor.intercept
方法的调用线程一致)。
val request = Request.Builder()
.tag(UpProgressCallback::class.java, UpProgressCallback { progress ->
val percent = (progress * 100).toInt()
TODO("处理上传进度监听")
})
...
- 在声明的接口中添加
DlProgressCallback
类型的参数,并标记@Tag
注解。
- 在调用该接口时,创建
DlProgressCallback
实例,并作为参数传递给该接口中即可。
/**
* url 文件的下载地址
* callback 下载进度的监听接口
* */
@GET
@Streaming
suspend fun download(@Url url: String, @Tag callback: DlProgressCallback): Call<ResponseBody>
- 在声明的接口中添加
UpProgressCallback
类型的参数,并标记@Tag
注解。
- 在调用该接口时,创建
UpProgressCallback
实例,并作为参数传递给该接口中即可。
@POST
@Streaming
suspend fun upload(@Url url: String, @Tag callback: UpProgressCallback): Call<Unit>