Parcourir la source

网络请求被取消不会回调onError

drake il y a 3 ans
Parent
commit
44645b869a

+ 1 - 2
net/src/main/java/com/drake/net/callback/DialogCallback.kt

@@ -13,7 +13,6 @@ import com.drake.net.interfaces.NetCallback
 import com.drake.net.request.group
 import okhttp3.Call
 import okhttp3.Request
-import java.io.IOException
 
 /**
  * 会自动在网络请求开始显示加载对话框, 在网络请求时关闭对话框.
@@ -49,7 +48,7 @@ abstract class DialogCallback<T> constructor(
         }
     }
 
-    override fun onComplete(call: Call, e: IOException?) {
+    override fun onComplete(call: Call, e: Throwable?) {
         dismiss()
         super.onComplete(call, e)
     }

+ 1 - 1
net/src/main/java/com/drake/net/callback/PageCallback.kt

@@ -44,7 +44,7 @@ abstract class PageCallback<T>(val page: PageRefreshLayout) : NetCallback<T>() {
         super.onError(call, e)
     }
 
-    override fun onComplete(call: Call, e: IOException?) {
+    override fun onComplete(call: Call, e: Throwable?) {
         if (e == null || e is CancellationException) {
             page.showContent()
         }

+ 1 - 1
net/src/main/java/com/drake/net/callback/StateCallback.kt

@@ -40,7 +40,7 @@ abstract class StateCallback<T>(val state: StateLayout) : NetCallback<T>() {
         super.onError(call, e)
     }
 
-    override fun onComplete(call: Call, e: IOException?) {
+    override fun onComplete(call: Call, e: Throwable?) {
         super.onComplete(call, e)
         if (e == null || e is CancellationException) state.showContent()
     }

+ 33 - 5
net/src/main/java/com/drake/net/interfaces/NetCallback.kt

@@ -1,5 +1,6 @@
 package com.drake.net.interfaces
 
+import androidx.annotation.MainThread
 import androidx.lifecycle.Lifecycle
 import androidx.lifecycle.LifecycleEventObserver
 import androidx.lifecycle.LifecycleOwner
@@ -14,11 +15,15 @@ import okhttp3.Request
 import okhttp3.Response
 import java.io.IOException
 import java.lang.reflect.ParameterizedType
+import java.util.concurrent.CancellationException
 
 /**
  * 提供泛型转换特性
  * 相对于OkHttp的Callback新增三个回调函数: [onSuccess] [onError] [onComplete]
  * 这三个函数都运行在主线程上
+ *
+ * @param lifecycle 将Activity/Fragment/LifecycleOwner等作为参数传递会在其生命周期结束时自动取消网络请求. 避免内存泄漏
+ * @param lifeEvent 指定自动取消的生命周期. 默认为[Lifecycle.Event.ON_DESTROY]
  */
 abstract class NetCallback<T> constructor(
     val lifecycle: LifecycleOwner? = null,
@@ -43,12 +48,21 @@ abstract class NetCallback<T> constructor(
     }
 
     override fun onFailure(call: Call, e: IOException) {
-        runMain {
-            onError(call, e)
-            onComplete(call, e)
+        val message = e.cause?.message
+        if (message == "Socket closed") {
+            runMain { onComplete(call, CancellationException(message)) }
+        } else {
+            runMain {
+                onError(call, e)
+                onComplete(call, e)
+            }
         }
     }
 
+    /**
+     * 网络请求开始
+     */
+    @MainThread
     open fun onStart(request: Request) {
         request.group = this
         lifecycle?.lifecycle?.addObserver(object : LifecycleEventObserver {
@@ -58,12 +72,26 @@ abstract class NetCallback<T> constructor(
         })
     }
 
+    /**
+     * 网络请求成功
+     *
+     * @param result 请求结果
+     */
+    @MainThread
     abstract fun onSuccess(call: Call, result: T)
 
+    /**
+     * 网络请求错误
+     */
+    @MainThread
     open fun onError(call: Call, e: IOException) = NetConfig.errorHandler.onError(e)
 
     /**
-     * @param e 正常结束则为NULL, 发生异常结束则为异常对象
+     * 网络请求完成, 无论错误还是正常结束
+     *
+     * @param e 正常结束则为null, 发生异常结束则为异常对象. 但是网络请求被取消则为[CancellationException], 且不会回调[onError]
      */
-    open fun onComplete(call: Call, e: IOException?) {}
+    @MainThread
+    open fun onComplete(call: Call, e: Throwable?) {
+    }
 }

+ 11 - 6
net/src/main/java/com/drake/net/request/BaseRequest.kt

@@ -19,7 +19,6 @@ package com.drake.net.request
 
 import com.drake.net.NetConfig
 import com.drake.net.convert.NetConverter
-import com.drake.net.exception.ConvertException
 import com.drake.net.exception.URLParseException
 import com.drake.net.interfaces.NetCallback
 import com.drake.net.interfaces.ProgressListener
@@ -33,6 +32,7 @@ import okhttp3.HttpUrl.Companion.toHttpUrlOrNull
 import java.io.File
 import java.io.IOException
 import java.net.URL
+import java.util.concurrent.CancellationException
 import kotlin.reflect.typeOf
 
 abstract class BaseRequest {
@@ -401,16 +401,21 @@ abstract class BaseRequest {
         setKType<R>()
         newCall.enqueue(object : Callback {
             override fun onFailure(call: Call, e: IOException) {
-                runMain { block(Result.failure(e)) }
+                val message = e.cause?.message
+                val exception = if (message == "Socket closed") {
+                    CancellationException(message)
+                } else e
+                runMain { block(Result.failure(exception)) }
             }
 
             override fun onResponse(call: Call, response: Response) {
-                try {
-                    val success = response.convert<R>(converter)
-                    runMain { block(Result.success(success)) }
-                } catch (e: ConvertException) {
+                val success = try {
+                    response.convert<R>(converter)
+                } catch (e: IOException) {
                     onFailure(call, e)
+                    return
                 }
+                runMain { block(Result.success(success)) }
             }
         })
         return newCall