Browse Source

pref: Optimize NetRequestBody/NetResponseBody

drake 1 year ago
parent
commit
d7cbf335e1

+ 2 - 4
net/src/main/java/com/drake/net/body/BodyExtension.kt

@@ -32,14 +32,12 @@ import okio.Buffer
 import okio.ByteString
 import java.util.concurrent.ConcurrentLinkedQueue
 
-fun RequestBody.toNetRequestBody(listeners: ConcurrentLinkedQueue<ProgressListener>? = null) = run {
-    NetRequestBody(this, listeners)
-}
+fun RequestBody.toNetRequestBody(listeners: ConcurrentLinkedQueue<ProgressListener>? = null) = NetRequestBody(this, listeners)
 
 fun ResponseBody.toNetResponseBody(
     listeners: ConcurrentLinkedQueue<ProgressListener>? = null,
     complete: (() -> Unit)? = null
-) = run { NetResponseBody(this, listeners, complete) }
+) = NetResponseBody(this, listeners, complete)
 
 /**
  * 复制一段指定长度的字符串内容

+ 4 - 4
net/src/main/java/com/drake/net/body/NetRequestBody.kt

@@ -38,7 +38,7 @@ class NetRequestBody(
 ) : RequestBody() {
 
     private val progress = Progress()
-    val contentLength by lazy { body.contentLength() }
+    private val contentLength by lazy { body.contentLength() }
 
     override fun contentType(): MediaType? {
         return body.contentType()
@@ -73,13 +73,13 @@ class NetRequestBody(
     }
 
     private fun Sink.toProgress() = object : ForwardingSink(this) {
-        var writeByteCount = 0L
+        private var writeByteCount = 0L
 
         @Throws(IOException::class)
         override fun write(source: Buffer, byteCount: Long) {
             super.write(source, byteCount)
-            writeByteCount += byteCount
-            if (progressListeners != null) {
+            if (!progressListeners.isNullOrEmpty()) {
+                writeByteCount += byteCount
                 val currentElapsedTime = SystemClock.elapsedRealtime()
                 progressListeners.forEach { progressListener ->
                     progressListener.intervalByteCount += byteCount

+ 3 - 3
net/src/main/java/com/drake/net/body/NetResponseBody.kt

@@ -66,14 +66,14 @@ class NetResponseBody(
     }
 
     private fun Source.toProgress() = object : ForwardingSource(this) {
-        var readByteCount: Long = 0
+        private var readByteCount: Long = 0
 
         @Throws(IOException::class)
         override fun read(sink: Buffer, byteCount: Long): Long {
             try {
                 val bytesRead = super.read(sink, byteCount)
-                readByteCount += if (bytesRead != -1L) bytesRead else 0
-                if (progressListeners != null) {
+                if (!progressListeners.isNullOrEmpty()) {
+                    readByteCount += if (bytesRead != -1L) bytesRead else 0
                     val currentElapsedTime = SystemClock.elapsedRealtime()
                     progressListeners.forEach { progressListener ->
                         progressListener.intervalByteCount += if (bytesRead != -1L) bytesRead else 0

+ 23 - 10
net/src/main/java/com/drake/net/interceptor/NetOkHttpInterceptor.kt

@@ -29,12 +29,15 @@ import com.drake.net.body.toNetRequestBody
 import com.drake.net.body.toNetResponseBody
 import com.drake.net.cache.CacheMode
 import com.drake.net.cache.ForceCache
-import com.drake.net.exception.*
-import com.drake.net.request.downloadListeners
+import com.drake.net.exception.HttpFailureException
+import com.drake.net.exception.NetConnectException
+import com.drake.net.exception.NetException
+import com.drake.net.exception.NetSocketTimeoutException
+import com.drake.net.exception.NetUnknownHostException
+import com.drake.net.exception.NoCacheException
 import com.drake.net.request.tagOf
-import com.drake.net.request.uploadListeners
+import com.drake.net.tag.NetTag
 import okhttp3.CacheControl
-import okhttp3.Call
 import okhttp3.Interceptor
 import okhttp3.Response
 import java.lang.ref.WeakReference
@@ -49,7 +52,7 @@ object NetOkHttpInterceptor : Interceptor {
 
     override fun intercept(chain: Interceptor.Chain): Response {
         var request = chain.request()
-        val reqBody = request.body?.toNetRequestBody(request.uploadListeners())
+        val reqBody = request.body?.toNetRequestBody(request.tagOf<NetTag.UploadListeners>())
         val cache = request.tagOf<ForceCache>() ?: NetConfig.forceCache
         val cacheMode = request.tagOf<CacheMode>()
         request = request.newBuilder().apply {
@@ -59,13 +62,14 @@ object NetOkHttpInterceptor : Interceptor {
         }.method(request.method, reqBody).build()
 
         try {
-            attach(chain)
+            appendRunningCall(chain)
             val response = if (cache != null) {
                 when (cacheMode) {
                     CacheMode.READ -> cache.get(request) ?: throw NoCacheException(request)
                     CacheMode.READ_THEN_REQUEST -> cache.get(request) ?: chain.proceed(request).run {
                         cache.put(this)
                     }
+
                     CacheMode.REQUEST_THEN_READ -> try {
                         chain.proceed(request).run {
                             cache.put(this)
@@ -73,16 +77,18 @@ object NetOkHttpInterceptor : Interceptor {
                     } catch (e: Exception) {
                         cache.get(request) ?: throw NoCacheException(request)
                     }
+
                     CacheMode.WRITE -> chain.proceed(request).run {
                         cache.put(this)
                     }
+
                     else -> chain.proceed(request)
                 }
             } else {
                 chain.proceed(request)
             }
-            val respBody = response.body?.toNetResponseBody(request.downloadListeners()) {
-                detach(chain.call())
+            val respBody = response.body?.toNetResponseBody(request.tagOf<NetTag.DownloadListeners>()) {
+                removeRunningCall(chain)
             }
             return response.newBuilder().body(respBody).build()
         } catch (e: SocketTimeoutException) {
@@ -98,12 +104,19 @@ object NetOkHttpInterceptor : Interceptor {
         }
     }
 
-    private fun attach(chain: Interceptor.Chain) {
+    /**
+     * 将请求添加到请求队列
+     */
+    private fun appendRunningCall(chain: Interceptor.Chain) {
         NetConfig.runningCalls.add(WeakReference(chain.call()))
     }
 
-    private fun detach(call: Call) {
+    /**
+     * 将请求从请求队列移除
+     */
+    private fun removeRunningCall(chain: Interceptor.Chain) {
         val iterator = NetConfig.runningCalls.iterator()
+        val call = chain.call()
         while (iterator.hasNext()) {
             if (iterator.next().get() == call) {
                 iterator.remove()