Android获取OKHttp3,android – 如何使用OkHTTP3 / Retrofit2获取多部...

我已经按照这个博文:https://medium.com/@PaulinaSadowska/display-progress-of-multipart-request-with-retrofit-and-rxjava-23a4a779e6ba进行了以下调整,以显示总进度而不是单独文件的进展:

private fun prepareFileParts(reportAttachments: MutableList, emitter: FlowableEmitter): List {

val multiPartBodyList = mutableListOf()

var offset = 0L

var totalLength = 0L

// calculate the total length of all files

for (attachment in reportAttachments) {

val file = File(attachment.filePath)

totalLength += file.length()

}

// create requestbody for each file and calculate the progression offset

for (attachment in reportAttachments) {

val file = File(attachment.filePath)

val mimeType = attachment.mimeType

val countingRequestBody = createCountingRequestBody(file, mimeType, emitter, offset, totalLength)

offset += file.length()

val multipartBody = MultipartBody.Part.createFormData("file", file.name, countingRequestBody)

multiPartBodyList.add(multipartBody)

}

return multiPartBodyList

}

private fun createCountingRequestBody(file: File, mimeType: String, emitter: FlowableEmitter, offset: Long, totalLength: Long): RequestBody {

val requestBody = RequestBody.create(MediaType.parse(mimeType), file)

return CountingRequestBody(requestBody, object : CountingRequestBody.Listener {

override fun onRequestProgress(bytesWritten: Long, contentLength: Long) {

val progress: Double = 1.0 * (offset + bytesWritten) / totalLength

emitter.onNext(progress)

}

})

}

如果需要,还可以创建拦截器并将其添加到OkHttpClient.这将默认跟踪所有传出的API调用.它看起来像这样:

class UploadProgressInterceptor(private val progressListener: CountingRequestBody.Listener) : Interceptor {

override fun intercept(chain: Interceptor.Chain): Response {

val originalRequest = chain.request()

if (originalRequest.body() == null) {

return chain.proceed(originalRequest)

}

val requestBody = originalRequest.body()

requestBody?.let {

val progressRequest = originalRequest.newBuilder()

.method(originalRequest.method(), CountingRequestBody(it, progressListener))

.build()

return chain.proceed(progressRequest)

}

return chain.proceed(originalRequest)

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值