package cn.flightfeather.thirdapp.common.net
|
|
import cn.flightfeather.thirdapp.common.net.NetWorkProgressListener
|
import okhttp3.MediaType
|
import okhttp3.RequestBody
|
import okio.*
|
|
/**
|
* @author riku
|
* Date: 2020/4/24
|
* 带进度回调的RequestBody
|
*/
|
class ProgressRequestBody(
|
private val mRequestBody: RequestBody?,
|
private val netWorkProgressListener: NetWorkProgressListener
|
) : RequestBody() {
|
|
override fun contentType(): MediaType? = mRequestBody?.contentType()
|
|
override fun contentLength(): Long = mRequestBody?.contentLength() ?: super.contentLength()
|
|
override fun writeTo(sink: BufferedSink) {
|
val progressSink = ProgressSink(sink)
|
val newSink = Okio.buffer(progressSink)
|
mRequestBody?.writeTo(newSink)
|
newSink.flush()
|
}
|
|
inner class ProgressSink(delegate: Sink) : ForwardingSink(delegate) {
|
private var bytesWritten = 0L
|
|
override fun write(source: Buffer, byteCount: Long) {
|
super.write(source, byteCount)
|
bytesWritten += byteCount
|
netWorkProgressListener.onProgress(bytesWritten, contentLength())
|
}
|
}
|
}
|