Forráskód Böngészése

优化标签相关函数

drake 3 éve
szülő
commit
6e37145148

+ 6 - 6
net/src/main/java/com/drake/net/Net.kt

@@ -182,7 +182,7 @@ object Net {
     fun addUploadListener(id: Any, progressListener: ProgressListener) {
         NetConfig.runningCalls.forEach {
             val request = it.get()?.request() ?: return@forEach
-            if (request.id() == id) {
+            if (request.id == id) {
                 request.addUploadListener(progressListener)
             }
         }
@@ -196,7 +196,7 @@ object Net {
     fun removeUploadListener(id: Any, progressListener: ProgressListener) {
         NetConfig.runningCalls.forEach {
             val request = it.get()?.request() ?: return@forEach
-            if (request.id() == id) {
+            if (request.id == id) {
                 request.uploadListeners()?.remove(progressListener)
             }
         }
@@ -210,7 +210,7 @@ object Net {
     fun addDownloadListener(id: Any, progressListener: ProgressListener) {
         NetConfig.runningCalls.forEach {
             val request = it.get()?.request() ?: return@forEach
-            if (request.id() == id) {
+            if (request.id == id) {
                 request.addDownloadListener(progressListener)
             }
         }
@@ -225,7 +225,7 @@ object Net {
     fun removeDownloadListener(id: Any, progressListener: ProgressListener) {
         NetConfig.runningCalls.forEach {
             val request = it.get()?.request() ?: return@forEach
-            if (request.id() == id) {
+            if (request.id == id) {
                 request.downloadListeners()?.remove(progressListener)
             }
         }
@@ -240,7 +240,7 @@ object Net {
     fun requestById(id: Any): Request? {
         NetConfig.runningCalls.forEach {
             val request = it.get()?.request() ?: return@forEach
-            if (request.id() == id) return request
+            if (request.id == id) return request
         }
         return null
     }
@@ -252,7 +252,7 @@ object Net {
         val requests = ArrayList<Request>()
         NetConfig.runningCalls.forEach {
             val request = it?.get()?.request() ?: return@forEach
-            if (request.group() == group) requests.add(request)
+            if (request.group == group) requests.add(request)
         }
         return requests
     }

+ 2 - 2
net/src/main/java/com/drake/net/NetConfig.kt

@@ -81,7 +81,7 @@ object NetConfig {
         progress
     }
 
-    @Deprecated("废弃", replaceWith = ReplaceWith("NetConfig.errorHandler"))
+    @Deprecated("使用NetErrorHandler统一处理错误", replaceWith = ReplaceWith("NetConfig.errorHandler"))
     var onError: Throwable.() -> Unit = onError@{
 
         val message = when (this) {
@@ -107,7 +107,7 @@ object NetConfig {
         toast(message)
     }
 
-    @Deprecated("废弃", replaceWith = ReplaceWith("NetConfig.errorHandler"))
+    @Deprecated("使用NetErrorHandler统一处理错误", replaceWith = ReplaceWith("NetConfig.errorHandler"))
     var onStateError: Throwable.(view: View) -> Unit = {
         when (this) {
             is ConvertException,

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

@@ -15,6 +15,13 @@ import okhttp3.Call
 import okhttp3.Request
 import java.io.IOException
 
+/**
+ * 会自动在网络请求开始显示加载对话框, 在网络请求时关闭对话框.
+ *
+ * @property activity 加载对话框所在的Activity
+ * @property dialog 单例加载对话框. 会覆盖全部加载对话框
+ * @property cancelable 加载对话框是否可以手动取消. 注意对话框取消网络请求也会被取消
+ */
 abstract class DialogCallback<T> constructor(
     val activity: FragmentActivity,
     var dialog: Dialog? = null,
@@ -29,7 +36,7 @@ abstract class DialogCallback<T> constructor(
                 dialog != null -> dialog
                 else -> NetConfig.dialogFactory.onCreate(activity)
             }
-            dialog?.setOnDismissListener { Net.cancelGroup(request.group()) }
+            dialog?.setOnDismissListener { Net.cancelGroup(request.group) }
             dialog?.setCancelable(cancelable)
             dialog?.show()
         }

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

@@ -11,6 +11,11 @@ import okhttp3.Request
 import java.io.IOException
 import java.util.concurrent.CancellationException
 
+/**
+ * 配合PageRefreshLayout布局使用
+ * 会在加载成功/错误时显示对应的缺省页
+ * 会在页面被销毁时自动取消网络请求
+ */
 abstract class PageCallback<T>(val page: PageRefreshLayout) : NetCallback<T>() {
     override fun onStart(request: Request) {
         super.onStart(request)
@@ -20,7 +25,7 @@ abstract class PageCallback<T>(val page: PageRefreshLayout) : NetCallback<T>() {
             }
 
             override fun onViewDetachedFromWindow(v: View) {
-                Net.cancelGroup(request.group())
+                Net.cancelGroup(request.group)
             }
         })
     }

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

@@ -11,6 +11,11 @@ import okhttp3.Request
 import java.io.IOException
 import java.util.concurrent.CancellationException
 
+/**
+ * 配合SateLayout布局使用
+ * 会在加载成功/错误时显示对应的缺省页
+ * 会在页面被销毁时自动取消网络请求
+ */
 abstract class StateCallback<T>(val state: StateLayout) : NetCallback<T>() {
 
     override fun onStart(request: Request) {
@@ -20,7 +25,7 @@ abstract class StateCallback<T>(val state: StateLayout) : NetCallback<T>() {
             }
 
             override fun onViewDetachedFromWindow(v: View) {
-                Net.cancelGroup(request.group())
+                Net.cancelGroup(request.group)
             }
         })
     }

+ 3 - 3
net/src/main/java/com/drake/net/interceptor/LogRecordInterceptor.kt

@@ -2,8 +2,8 @@ package com.drake.net.interceptor
 
 import android.util.Log
 import com.drake.net.log.LogRecorder
-import com.drake.net.request.isLogRecord
 import com.drake.net.request.label
+import com.drake.net.request.logRecord
 import com.drake.net.request.logString
 import com.drake.net.response.logString
 import com.drake.net.tag.NetLabel
@@ -35,9 +35,9 @@ open class LogRecordInterceptor(
 
     override fun intercept(chain: Interceptor.Chain): Response {
         val request = chain.request()
-        request.label<NetLabel.RecordLog>()
+        request.label<NetLabel.LogRecord>()
 
-        if (request.isLogRecord() == false) {
+        if (request.logRecord == false) {
             return chain.proceed(request)
         }
 

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

@@ -47,10 +47,10 @@ abstract class NetCallback<T> constructor(
     }
 
     open fun onStart(request: Request) {
-        request.group()
+        request.group = this
         lifecycle?.lifecycle?.addObserver(object : LifecycleEventObserver {
             override fun onStateChanged(source: LifecycleOwner, event: Lifecycle.Event) {
-                if (lifeEvent == event) Net.cancelGroup(request.group())
+                if (lifeEvent == event) Net.cancelGroup(request.group)
             }
         })
     }

+ 2 - 7
net/src/main/java/com/drake/net/request/BaseRequest.kt

@@ -40,7 +40,6 @@ abstract class BaseRequest {
     open var httpUrl: HttpUrl.Builder = HttpUrl.Builder()
     open var converter: NetConverter = NetConfig.converter
     open var method = Method.GET
-    open var tags: NetLabel.TagHashMap = NetLabel.TagHashMap()
 
     //<editor-fold desc="OkHttpClient" >
     open var okHttpRequest: Request.Builder = Request.Builder()
@@ -148,7 +147,7 @@ abstract class BaseRequest {
      * @param tag 标签
      */
     fun setTag(name: String, tag: Any?) {
-        tags[name] = tag
+        okHttpRequest.setTag(name, tag)
     }
 
     /**
@@ -260,11 +259,9 @@ abstract class BaseRequest {
      * 下载监听器
      */
     fun addDownloadListener(progressListener: ProgressListener) {
-        downloadListeners.add(progressListener)
+        okHttpRequest.downloadListeners().add(progressListener)
     }
 
-    protected val downloadListeners = NetLabel.DownloadListeners()
-
     //</editor-fold>
 
     /**
@@ -277,9 +274,7 @@ abstract class BaseRequest {
     open fun buildRequest(): Request {
         return okHttpRequest.method(method.name, null)
             .url(httpUrl.build())
-            .setLabel(tags)
             .setConverter(converter)
-            .setLabel(downloadListeners)
             .build()
     }
 

+ 1 - 7
net/src/main/java/com/drake/net/request/BodyRequest.kt

@@ -19,7 +19,6 @@
 package com.drake.net.request
 
 import com.drake.net.interfaces.ProgressListener
-import com.drake.net.tag.NetLabel
 import com.drake.net.utils.lazyField
 import com.drake.net.utils.toRequestBody
 import okhttp3.*
@@ -116,11 +115,9 @@ open class BodyRequest : BaseRequest() {
      * 上传进度监听器
      */
     fun addUploadListener(progressListener: ProgressListener) {
-        uploadListeners.add(progressListener)
+        okHttpRequest.uploadListeners().add(progressListener)
     }
 
-    private val uploadListeners = NetLabel.UploadListeners()
-
     override fun buildRequest(): Request {
         val body = if (body != null) body else {
             val form = formBody.build()
@@ -139,10 +136,7 @@ open class BodyRequest : BaseRequest() {
 
         return okHttpRequest.method(method.name, body)
             .url(httpUrl.build())
-            .setLabel(tags)
             .setConverter(converter)
-            .setLabel(downloadListeners)
-            .setLabel(uploadListeners)
             .build()
     }
 }

+ 166 - 35
net/src/main/java/com/drake/net/request/RequestExtension.kt

@@ -21,77 +21,165 @@ import com.drake.net.body.peekString
 import com.drake.net.convert.NetConverter
 import com.drake.net.interfaces.ProgressListener
 import com.drake.net.tag.NetLabel
+import okhttp.OkHttpUtils
 import okhttp3.FormBody
 import okhttp3.Request
 import java.util.concurrent.ConcurrentLinkedQueue
 import kotlin.reflect.KType
 
 //<editor-fold desc="请求属性">
+
 /**
  * 请求的Id
  */
+var Request.id: Any?
+    get() = label<NetLabel.RequestId>()
+    set(value) {
+        setLabel(NetLabel.RequestId(value))
+    }
+
+/**
+ * 请求的分组名
+ * Group和Id本质上都是任意对象Any. 但是Net网络请求中自动取消的操作都是通过Group分组. 如果你覆盖可能会导致自动取消无效
+ * 在设计理念上分组可以重复. Id不行
+ */
+var Request.group: Any?
+    get() = label<NetLabel.RequestGroup>()
+    set(value) {
+        setLabel(NetLabel.RequestGroup(value))
+    }
+
+/**
+ * 是否输出网络请求日志
+ * 该属性和[NetConfig.logEnabled]有所区别
+ * @see [com.drake.net.interceptor.LogRecordInterceptor]
+ */
+var Request.logRecord: Boolean?
+    get() = label<NetLabel.LogRecord>()?.enabled
+    set(value) {
+        setLabel(value?.let { NetLabel.LogRecord(it) })
+    }
+
+/**
+ * KType属于Kotlin特有的Type, 某些kotlin独占框架可能会使用到. 例如 kotlin.serialization
+ */
+var Request.kType: KType?
+    get() = label<NetLabel.RequestKType>()?.value
+    set(value) {
+        setLabel(NetLabel.RequestKType(value))
+    }
+
+@Deprecated("建议使用属性", ReplaceWith("id"))
 fun Request.id(): Any? {
-    return label<NetLabel.RequestId>()?.value
+    return id
 }
 
-fun Request.Builder.setId(id: Any?) = apply {
-    setLabel(NetLabel.RequestId(id))
+@Deprecated("建议使用属性", ReplaceWith("group"))
+fun Request.group(): Any? {
+    return group
+}
+
+@Deprecated("建议使用属性", ReplaceWith("logRecord"))
+fun Request.isLogRecord(): Boolean? {
+    return logRecord
 }
 
+@Deprecated("建议使用属性", ReplaceWith("kType"))
+fun Request.kType(): KType? {
+    return kType
+}
+
+//</editor-fold>
+
+//<editor-fold desc="Request.Builder">
+
 /**
- * 请求的分组名
+ * 设置请求Id
  */
-fun Request.group(): Any? {
-    return label<NetLabel.RequestGroup>()?.value
+fun Request.Builder.setId(id: Any?) = apply {
+    setLabel(NetLabel.RequestId(id))
 }
 
+/**
+ * 设置请求分组
+ */
 fun Request.Builder.setGroup(group: Any?) = apply {
     setLabel(NetLabel.RequestGroup(group))
 }
 
 /**
- * 请求标签
+ * 设置是否记录日志
  */
-fun Request.tag(name: String): Any? {
-    return label<NetLabel.TagHashMap>()?.get(name)
+fun Request.Builder.setLogRecord(enabled: Boolean) = apply {
+    setLabel(NetLabel.LogRecord(enabled))
 }
 
 /**
- * 请求标签
+ * 设置KType
  */
-fun Request.setTag(name: String, value: Any?) = apply {
-    label<NetLabel.TagHashMap>()?.put(name, value)
+fun Request.Builder.setKType(type: KType) = apply {
+    setLabel(type)
 }
+//</editor-fold>
+
+//<editor-fold desc="标签">
 
 /**
- * 设置是否记录日志
+ * 返回键值对的tag
  */
-fun Request.Builder.setLogRecord(enabled: Boolean) = apply {
-    setLabel(NetLabel.RecordLog(enabled))
+fun Request.tag(name: String): Any? {
+    return label<NetLabel.Tags>()?.get(name)
 }
 
 /**
- * 是否记录日志
+ * 设置键值对的tag
  */
-fun Request.isLogRecord() = run {
-    label<NetLabel.RecordLog>()?.enabled
+fun Request.setTag(name: String, value: Any?) {
+    var tags = label<NetLabel.Tags>()
+    if (tags == null) {
+        tags = NetLabel.Tags()
+        setLabel(tags)
+    }
+    tags[name] = value
 }
 
-fun Request.Builder.setKType(type: KType) = apply {
-    setLabel(type)
+fun Request.Builder.setTag(name: String, value: Any?) = apply {
+    var tags = label<NetLabel.Tags>()
+    if (tags == null) {
+        tags = NetLabel.Tags()
+        setLabel(tags)
+    }
+    tags[name] = value
+}
+
+/**
+ * 返回OkHttp的tag(通过Class区分的tag)
+ */
+inline fun <reified T> Request.label(): T? {
+    return tag(T::class.java)
+}
+
+/**
+ * 返回OkHttp的tag(通过Class区分的tag)
+ */
+inline fun <reified T> Request.Builder.label(): T? {
+    return OkHttpUtils.tags(this)[T::class.java] as? T
 }
 
-fun Request.kType(): KType? = run {
-    label<KType>()
+/**
+ * 设置OkHttp的tag(通过Class区分的tag)
+ */
+inline fun <reified T> Request.setLabel(any: T) = apply {
+    OkHttpUtils.tags(this)[T::class.java] = any
 }
 
+/**
+ * 设置OkHttp的tag(通过Class区分的tag)
+ */
 inline fun <reified T> Request.Builder.setLabel(any: T) = apply {
     tag(T::class.java, any)
 }
 
-inline fun <reified T> Request.label(): T? {
-    return tag(T::class.java)
-}
 //</editor-fold>
 
 //<editor-fold desc="下载">
@@ -144,35 +232,78 @@ fun Request.downloadTempFile(): Boolean {
 
 //<editor-fold desc="进度监听">
 /**
- * 上传监听器
+ * 全部的上传监听器
+ */
+fun Request.uploadListeners(): ConcurrentLinkedQueue<ProgressListener> {
+    var uploadListeners = label<NetLabel.UploadListeners>()
+    if (uploadListeners == null) {
+        uploadListeners = NetLabel.UploadListeners()
+        setLabel(uploadListeners)
+    }
+    return uploadListeners
+}
+
+/**
+ * 全部的上传监听器
+ */
+fun Request.Builder.uploadListeners(): ConcurrentLinkedQueue<ProgressListener> {
+    var uploadListeners = label<NetLabel.UploadListeners>()
+    if (uploadListeners == null) {
+        uploadListeners = NetLabel.UploadListeners()
+        setLabel(uploadListeners)
+    }
+    return uploadListeners
+}
+
+/**
+ * 全部的下载监听器
  */
-fun Request.uploadListeners(): ConcurrentLinkedQueue<ProgressListener>? {
-    return label<NetLabel.UploadListeners>()
+fun Request.downloadListeners(): ConcurrentLinkedQueue<ProgressListener> {
+    var downloadListeners = label<NetLabel.DownloadListeners>()
+    if (downloadListeners == null) {
+        downloadListeners = NetLabel.DownloadListeners()
+        setLabel(downloadListeners)
+    }
+    return downloadListeners
 }
 
 /**
- * 下载监听器
+ * 全部的下载监听器
  */
-fun Request.downloadListeners(): ConcurrentLinkedQueue<ProgressListener>? {
-    return label<NetLabel.DownloadListeners>()
+fun Request.Builder.downloadListeners(): ConcurrentLinkedQueue<ProgressListener> {
+    var downloadListeners = label<NetLabel.DownloadListeners>()
+    if (downloadListeners == null) {
+        downloadListeners = NetLabel.DownloadListeners()
+        setLabel(downloadListeners)
+    }
+    return downloadListeners
 }
 
+/**
+ * 添加上传监听器
+ */
 fun Request.addUploadListener(progressListener: ProgressListener) {
-    uploadListeners()?.add(progressListener)
+    uploadListeners().add(progressListener)
 }
 
+/**
+ * 添加下载监听器
+ */
 fun Request.addDownloadListener(progressListener: ProgressListener) {
-    downloadListeners()?.add(progressListener)
+    downloadListeners().add(progressListener)
 }
 //</editor-fold>
 
 /**
  * 转换器
  */
-fun Request.converter(): NetConverter? {
-    return label<NetConverter>()
+fun Request.converter(): NetConverter {
+    return label<NetConverter>() ?: NetConfig.converter
 }
 
+/**
+ * 设置转换器
+ */
 fun Request.Builder.setConverter(converter: NetConverter) = apply {
     setLabel(converter)
 }

+ 1 - 3
net/src/main/java/com/drake/net/response/ResponseExtention.kt

@@ -150,9 +150,7 @@ inline fun <reified R> Response.convert(converter: NetConverter): R = use {
 @Throws(IOException::class)
 fun <R> Response.convert(type: Type): R = use {
     try {
-        val converter = request.converter() ?: throw ConvertException(
-            it, message = "No converter for current request"
-        )
+        val converter = request.converter()
         converter.onConvert<R>(type, this) as R
     } catch (e: NetException) {
         throw e

+ 10 - 7
net/src/main/java/com/drake/net/tag/NetLabel.kt

@@ -19,22 +19,25 @@ package com.drake.net.tag
 import com.drake.net.interfaces.ProgressListener
 import java.io.File
 import java.util.concurrent.ConcurrentLinkedQueue
+import kotlin.reflect.KType
 
 sealed class NetLabel {
+    class Tags : HashMap<String, Any?>()
+
     inline class RequestId(val value: Any?)
     inline class RequestGroup(val value: Any?)
-    inline class RecordLog(val enabled: Boolean)
-
-    inline class DownloadFileDir(val dir: String?) {
-        constructor(fileDir: File?) : this(fileDir?.absolutePath)
-    }
+    inline class RequestKType(val value: KType?)
+    inline class LogRecord(val enabled: Boolean)
 
     inline class DownloadFileMD5Verify(val enabled: Boolean = true)
     inline class DownloadFileNameDecode(val enabled: Boolean = true)
     inline class DownloadTempFile(val enabled: Boolean = true)
     inline class DownloadFileConflictRename(val enabled: Boolean = true)
     inline class DownloadFileName(val name: String?)
-    class DownloadListeners : ConcurrentLinkedQueue<ProgressListener>()
+    inline class DownloadFileDir(val dir: String?) {
+        constructor(fileDir: File?) : this(fileDir?.absolutePath)
+    }
+
     class UploadListeners : ConcurrentLinkedQueue<ProgressListener>()
-    class TagHashMap : HashMap<String, Any?>()
+    class DownloadListeners : ConcurrentLinkedQueue<ProgressListener>()
 }

+ 21 - 0
net/src/main/java/okhttp/OkHttpUtils.java

@@ -0,0 +1,21 @@
+package okhttp;
+
+import java.lang.reflect.Field;
+import java.util.Map;
+
+import okhttp3.Request;
+
+@SuppressWarnings("KotlinInternalInJava")
+public class OkHttpUtils {
+
+    public static Map<Class<?>, Object> tags(Request.Builder builder) {
+        return builder.getTags$okhttp();
+    }
+
+    public static Map<Class<?>, Object> tags(Request request) throws NoSuchFieldException, IllegalAccessException {
+        Field field = request.getTags$okhttp().getClass().getDeclaredField("m");
+        field.setAccessible(true);
+        Object tags = field.get(request.getTags$okhttp());
+        return (Map<Class<?>, Object>) tags;
+    }
+}

+ 1 - 1
sample/src/main/java/com/drake/net/sample/converter/SerializationConverter.kt

@@ -36,7 +36,7 @@ class SerializationConverter(
             when {
                 code in 200..299 -> { // 请求成功
                     val bodyString = response.body?.string() ?: return null
-                    val kType = response.request.kType() ?: return null
+                    val kType = response.request.kType ?: return null
                     return try {
                         val json = JSONObject(bodyString) // 获取JSON中后端定义的错误码和错误信息
                         if (json.getString(this.code) == success) { // 对比后端自定义错误码