Browse Source

删除Callback/onResult

drake 2 years ago
parent
commit
4018877009

+ 9 - 75
docs/callback.md

@@ -1,14 +1,7 @@
-Net支持OkHttp的原有的队列请求 -- `Callback`
+Net支持OkHttp的原有的队列请求`Callback`
 
-<p align="center">
-<strong>如果你决定使用协程可以不必阅读本章</strong>
-</p>
+> Callback属于接口回调请求, 其代码冗余可读性不高, 并且无法支持并发请求协作
 
-> Callback属于接口回调请求, 属于最原始的请求方式. 其代码冗余可读性不高, 并且无法支持并发请求协作
-
-## Callback
-
-Callback属于OkHttp最原始的请求回调接口
 
 ```kotlin
 Net.post("api").enqueue(object : Callback {
@@ -16,71 +9,12 @@ Net.post("api").enqueue(object : Callback {
     }
 
     override fun onResponse(call: Call, response: Response) {
+        // 此处为子线程
+        val body = response.body?.string() ?: "无数据"
+        runMain {
+            // 此处为主线程
+            binding.tvFragment.text = body
+        }
     }
 })
-```
-
-## NetCallback
-
-原始的Callback是没有任何数据转换和全局错误功能的. 这里可以使用NetCallback
-
-```kotlin
-Net.post("api") {
-    param("password", "Net123")
-}.enqueue(object : NetCallback<String>() {
-    override fun onSuccess(call: Call, data: String) {
-        tvFragment.text = data
-    }
-})
-```
-
-NetCallback相较于Callback的特性
-
-1. 可以指定泛型数据转换
-2. 新增三个回调函数: onSuccess/onFailure/onComplete
-3. 以上三个回调函数都运行在主线程
-
-<br>
-基本特性也被扩展在Callback中. 除开库本身自带的Callback你也可以仿照实现自己的特殊Callback
-
-| 函数 | 描述 |
-|-|-|
-| DialogCallback | 自动显示隐藏加载对话框 |
-| StateCallback | 自动显示缺省页 |
-| PageCallback | 自动下拉刷新/上拉加载 |
-
-## onResult
-
-使用`onResult`可以更加灵活方便的处理队列请求. 使用Kotlin的空安全函数可以区分处理请求结果
-
-```kotlin
-Net.post("api").onResult<String> {
-
-    getOrNull()?.let { // 如果成功就不为Null
-        Log.d("日志", "请求成功")
-        tvFragment.text = it
-    }
-
-    exceptionOrNull()?.apply {
-        Log.d("日志", "请求失败")
-        Net.printStackTrace(this) // 如果发生错误就不为Null
-    }
-
-    Log.d("日志", "完成请求")
-}
-```
-
-onResult也是在主线程中执行
-
-|请求函数|描述|
-|-|-|
-|Net.get|标准Http请求方法|
-|Net.post|标准Http请求方法|
-|Net.head|标准Http请求方法|
-|Net.options|标准Http请求方法|
-|Net.trace|标准Http请求方法|
-|Net.delete|标准Http请求方法|
-|Net.put|标准Http请求方法|
-|Net.patch|标准Http请求方法|
-
-
+```

+ 0 - 63
net/src/main/java/com/drake/net/callback/DialogCallback.kt

@@ -1,63 +0,0 @@
-@file:Suppress("MemberVisibilityCanBePrivate")
-
-package com.drake.net.callback
-
-import android.app.Dialog
-import androidx.annotation.MainThread
-import androidx.fragment.app.FragmentActivity
-import androidx.lifecycle.Lifecycle
-import androidx.lifecycle.LifecycleObserver
-import androidx.lifecycle.OnLifecycleEvent
-import com.drake.net.Net
-import com.drake.net.NetConfig
-import com.drake.net.interfaces.NetCallback
-import com.drake.net.request.group
-import okhttp3.Call
-import okhttp3.Request
-
-/**
- * 会自动在网络请求开始显示加载对话框, 在网络请求时关闭对话框.
- *
- * @property activity 加载对话框所在的Activity
- * @property dialog 单例加载对话框. 会覆盖全部加载对话框
- * @property cancelable 加载对话框是否可以手动取消. 注意对话框取消网络请求也会被取消
- */
-abstract class DialogCallback<T> constructor(
-    val activity: FragmentActivity,
-    var dialog: Dialog? = null,
-    val cancelable: Boolean = true,
-) : NetCallback<T>(), LifecycleObserver {
-
-    /** 网络请求开始 */
-    @MainThread
-    override fun onStart(request: Request) {
-        super.onStart(request)
-        activity.lifecycle.addObserver(this)
-        activity.runOnUiThread {
-            dialog = when {
-                dialog != null -> dialog
-                else -> NetConfig.dialogFactory.onCreate(activity)
-            }
-            dialog?.setOnDismissListener { Net.cancelGroup(request.group) }
-            dialog?.setCancelable(cancelable)
-            dialog?.show()
-        }
-    }
-
-    @OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
-    fun dismiss() {
-        if (dialog?.isShowing == true) {
-            dialog?.dismiss()
-        }
-    }
-
-    /**
-     * 网络请求完成
-     * @param e 假设请求过程中发生错误则不为null
-     */
-    @MainThread
-    override fun onComplete(call: Call, e: Throwable?) {
-        dismiss()
-        super.onComplete(call, e)
-    }
-}

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

@@ -1,70 +0,0 @@
-package com.drake.net.callback
-
-import android.view.View
-import androidx.annotation.MainThread
-import com.drake.brv.PageRefreshLayout
-import com.drake.net.Net
-import com.drake.net.NetConfig
-import com.drake.net.interfaces.NetCallback
-import com.drake.net.request.group
-import okhttp3.Call
-import okhttp3.Request
-import java.io.IOException
-import java.util.concurrent.CancellationException
-
-/**
- * 配合PageRefreshLayout布局使用
- * 会在加载成功/错误时显示对应的缺省页
- * 会在页面被销毁时自动取消网络请求
- */
-abstract class PageCallback<T>(val page: PageRefreshLayout) : NetCallback<T>() {
-
-    /** 网络请求开始 */
-    @MainThread
-    override fun onStart(request: Request) {
-        super.onStart(request)
-        page.addOnAttachStateChangeListener(object : View.OnAttachStateChangeListener {
-            override fun onViewAttachedToWindow(v: View) {
-
-            }
-
-            override fun onViewDetachedFromWindow(v: View) {
-                Net.cancelGroup(request.group)
-            }
-        })
-    }
-
-    /**
-     * 网络请求失败, 异步线程
-     * @param e 请求过程中发生错误则
-     */
-    override fun onFailure(call: Call, e: IOException) {
-        page.showError(e)
-        super.onFailure(call, e)
-    }
-
-    /**
-     * 网络请求完成
-     * @param e 请求过程中发生错误则
-     */
-    @MainThread
-    override fun onError(call: Call, e: IOException) {
-        if (page.loaded || !page.stateEnabled) {
-            NetConfig.errorHandler.onError(e)
-        } else {
-            NetConfig.errorHandler.onStateError(e, page)
-        }
-    }
-
-    /**
-     * 网络请求完成
-     * @param e 假设请求过程中发生错误则不为null
-     */
-    @MainThread
-    override fun onComplete(call: Call, e: Throwable?) {
-        if (e == null || e is CancellationException) {
-            page.showContent()
-        }
-        super.onComplete(call, e)
-    }
-}

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

@@ -1,63 +0,0 @@
-package com.drake.net.callback
-
-import android.view.View
-import androidx.annotation.MainThread
-import com.drake.net.Net
-import com.drake.net.NetConfig
-import com.drake.net.interfaces.NetCallback
-import com.drake.net.request.group
-import com.drake.statelayout.StateLayout
-import okhttp3.Call
-import okhttp3.Request
-import java.io.IOException
-import java.util.concurrent.CancellationException
-
-/**
- * 配合SateLayout布局使用
- * 会在加载成功/错误时显示对应的缺省页
- * 会在页面被销毁时自动取消网络请求
- */
-abstract class StateCallback<T>(val state: StateLayout) : NetCallback<T>() {
-
-    /** 网络请求开始 */
-    @MainThread
-    override fun onStart(request: Request) {
-        super.onStart(request)
-        state.addOnAttachStateChangeListener(object : View.OnAttachStateChangeListener {
-            override fun onViewAttachedToWindow(v: View?) {
-            }
-
-            override fun onViewDetachedFromWindow(v: View) {
-                Net.cancelGroup(request.group)
-            }
-        })
-    }
-
-    /**
-     * 网络请求失败, 异步线程
-     * @param e 请求过程中发生错误则
-     */
-    override fun onFailure(call: Call, e: IOException) {
-        state.showError(e)
-        super.onFailure(call, e)
-    }
-
-    /**
-     * 网络请求完成
-     * @param e 请求过程中发生错误则
-     */
-    @MainThread
-    override fun onError(call: Call, e: IOException) {
-        NetConfig.errorHandler.onStateError(e, state)
-    }
-
-    /**
-     * 网络请求完成
-     * @param e 假设请求过程中发生错误则不为null
-     */
-    @MainThread
-    override fun onComplete(call: Call, e: Throwable?) {
-        super.onComplete(call, e)
-        if (e == null || e is CancellationException) state.showContent()
-    }
-}

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

@@ -1,101 +0,0 @@
-package com.drake.net.interfaces
-
-import androidx.annotation.MainThread
-import androidx.lifecycle.Lifecycle
-import androidx.lifecycle.LifecycleEventObserver
-import androidx.lifecycle.LifecycleOwner
-import com.drake.net.Net
-import com.drake.net.NetConfig
-import com.drake.net.request.group
-import com.drake.net.response.convert
-import com.drake.net.utils.runMain
-import okhttp3.Call
-import okhttp3.Callback
-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,
-    val lifeEvent: Lifecycle.Event = Lifecycle.Event.ON_DESTROY
-) : Callback {
-
-    lateinit var request: Request
-        internal set
-
-    override fun onResponse(call: Call, response: Response) {
-        val succeed = (javaClass.genericSuperclass as ParameterizedType).actualTypeArguments[0]
-        val data = try {
-            response.convert<T>(succeed)
-        } catch (e: IOException) {
-            onFailure(call, e)
-            return
-        }
-        runMain {
-            onSuccess(call, data)
-            onComplete(call, null)
-        }
-    }
-
-    /**
-     * 网络请求错误, 异步线程
-     * @param e 请求过程中发生错误则
-     */
-    override fun onFailure(call: Call, e: IOException) {
-        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 {
-            override fun onStateChanged(source: LifecycleOwner, event: Lifecycle.Event) {
-                if (lifeEvent == event) Net.cancelGroup(request.group)
-            }
-        })
-    }
-
-    /**
-     * 网络请求成功
-     *
-     * @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, 发生异常结束则为异常对象. 但是网络请求被取消则为[CancellationException], 且不会回调[onError]
-     */
-    @MainThread
-    open fun onComplete(call: Call, e: Throwable?) {
-    }
-}

+ 0 - 37
net/src/main/java/com/drake/net/request/BaseRequest.kt

@@ -20,19 +20,15 @@ package com.drake.net.request
 import com.drake.net.NetConfig
 import com.drake.net.convert.NetConverter
 import com.drake.net.exception.URLParseException
-import com.drake.net.interfaces.NetCallback
 import com.drake.net.interfaces.ProgressListener
 import com.drake.net.okhttp.toNetOkhttp
 import com.drake.net.response.convert
 import com.drake.net.tag.NetTag
-import com.drake.net.utils.runMain
 import okhttp3.*
 import okhttp3.HttpUrl.Companion.toHttpUrl
 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 {
@@ -407,42 +403,9 @@ abstract class BaseRequest {
         NetConfig.requestInterceptor?.interceptor(this)
         val request = buildRequest()
         val newCall = okHttpClient.newCall(request)
-        if (block is NetCallback<*>) {
-            block.request = request
-            block.onStart(request)
-        }
         newCall.enqueue(block)
         return newCall
     }
-
-    /**
-     * 队列请求. 支持Result作为请求结果
-     */
-    inline fun <reified R> onResult(crossinline block: Result<R>.() -> Unit): Call {
-        NetConfig.requestInterceptor?.interceptor(this)
-        val newCall = okHttpClient.newCall(buildRequest())
-        setKType<R>()
-        newCall.enqueue(object : Callback {
-            override fun onFailure(call: Call, e: IOException) {
-                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) {
-                val success = try {
-                    response.convert<R>(converter)
-                } catch (e: IOException) {
-                    onFailure(call, e)
-                    return
-                }
-                runMain { block(Result.success(success)) }
-            }
-        })
-        return newCall
-    }
     //</editor-fold>
 }
 

+ 16 - 33
sample/src/main/java/com/drake/net/sample/ui/fragment/CallbackRequestFragment.kt

@@ -1,10 +1,14 @@
 package com.drake.net.sample.ui.fragment
 
-import android.util.Log
 import com.drake.engine.base.EngineFragment
 import com.drake.net.Net
 import com.drake.net.sample.R
 import com.drake.net.sample.databinding.FragmentCallbackRequestBinding
+import com.drake.net.utils.runMain
+import okhttp3.Call
+import okhttp3.Callback
+import okhttp3.Response
+import java.io.IOException
 
 class CallbackRequestFragment :
     EngineFragment<FragmentCallbackRequestBinding>(R.layout.fragment_callback_request) {
@@ -13,40 +17,19 @@ class CallbackRequestFragment :
     }
 
     override fun initView() {
-
-        // Net同样支持OkHttp的队列任务
-
-        // Net.post("api").enqueue(object : Callback {
-        //     override fun onFailure(call: Call, e: IOException) {
-        //     }
-        //
-        //     override fun onResponse(call: Call, response: Response) {
-        //     }
-        // })
-
-        // NetCallback支持数据转换
-        // Net.post("api") {
-        //     param("password", "Net123")
-        // }.enqueue(object : NetCallback<String>() {
-        //     override fun onSuccess(call: Call, result: String) {
-        //         binding.tvFragment.text = result // onSuccess 属于主线程
-        //     }
-        // })
-
-        // 简化版本的队列请求
-        Net.post("api").onResult<String> {
-
-            getOrNull()?.let { // 如果成功就不为Null
-                Log.d("日志", "请求成功")
-                binding.tvFragment.text = it
+        // Net同样支持OkHttp原始的队列任务
+        Net.post("api").enqueue(object : Callback {
+            override fun onFailure(call: Call, e: IOException) {
             }
 
-            exceptionOrNull()?.apply {
-                Log.d("日志", "请求失败")
-                Net.printStackTrace(this) // 如果发生错误就不为Null
+            override fun onResponse(call: Call, response: Response) {
+                // 此处为子线程
+                val body = response.body?.string() ?: "无数据"
+                runMain {
+                    // 此处为主线程
+                    binding.tvFragment.text = body
+                }
             }
-
-            Log.d("日志", "完成请求")
-        }
+        })
     }
 }