1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
package cn.flightfeather.thirdappmodule.common.net
 
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())
        }
    }
}