Browse Source

添加toResult执行同步请求

drake 3 years ago
parent
commit
d75d42f119
2 changed files with 24 additions and 4 deletions
  1. 1 1
      net/build.gradle
  2. 23 3
      net/src/main/java/com/drake/net/request/BaseRequest.kt

+ 1 - 1
net/build.gradle

@@ -42,7 +42,7 @@ android {
     }
 
     kotlinOptions {
-        freeCompilerArgs = ["-Xinline-classes"]
+        freeCompilerArgs = ["-Xinline-classes", "-Xallow-result-return-type"]
     }
 
     dokka {

+ 23 - 3
net/src/main/java/com/drake/net/request/BaseRequest.kt

@@ -23,6 +23,7 @@ import com.drake.net.exception.URLParseException
 import com.drake.net.interfaces.ProgressListener
 import com.drake.net.okhttp.toNetOkhttp
 import com.drake.net.tag.NetLabel
+import com.drake.net.utils.runMain
 import okhttp3.*
 import okhttp3.HttpUrl.Companion.toHttpUrl
 import okhttp3.HttpUrl.Companion.toHttpUrlOrNull
@@ -280,7 +281,7 @@ abstract class BaseRequest {
     }
 
     /**
-     * 执行请求
+     * 执行同步请求
      */
     @OptIn(ExperimentalStdlibApi::class)
     inline fun <reified R> execute(): R {
@@ -293,6 +294,25 @@ abstract class BaseRequest {
         }
     }
 
+    /**
+     * 执行同步请求
+     * @return 一个包含请求成功和错误的Result
+     */
+    inline fun <reified R> toResult(): Result<R> {
+        NetConfig.requestInterceptor?.interceptor(this)
+        setKType<R>()
+        val request = buildRequest()
+        val newCall = okHttpClient.newCall(request)
+        return try {
+            val value = newCall.execute().use {
+                converter.onConvert<R>(R::class.java, it) as R
+            }
+            Result.success(value)
+        } catch (e: Exception) {
+            Result.failure(e)
+        }
+    }
+
     /**
      * 队列请求. 支持OkHttp的Callback函数组件
      */
@@ -312,12 +332,12 @@ abstract class BaseRequest {
         setKType<R>()
         newCall.enqueue(object : Callback {
             override fun onFailure(call: Call, e: IOException) {
-                block(Result.failure(e))
+                runMain { block(Result.failure(e)) }
             }
 
             override fun onResponse(call: Call, response: Response) {
                 val result = converter.onConvert<R>(R::class.java, response) as R
-                block(Result.success(result))
+                runMain { block(Result.success(result)) }
             }
         })
         return newCall