前言
DSL是Domain-specific language(领域特定语言)的缩写,维基百科的定义是指的是专注于某个应用程序领域的计算机语言。
这种说法看起来很抽象,其实大家很常用的gradle就是DSL最常用体现,可以看一下android project中的build.gradle:
android{}, dependencies{}这种都是DSL的表现形式,相对于传统的写法更加简洁、表现内容更加明显,如配置文件般的去执行方法,这也是为什么推荐DSL写法的原因。
以下封装的标准DSL请求方式如下:
对比之后我们发现可以说是和gradle基本一样,接下来就展示如何封装。
request2
分析
- 首先请求是放在一个request对象内
- request内包含多个方法loader、start、onSuccess等,作用也很明显就是,不再过多阐述
构建request
class Request<T> {
lateinit var loader: suspend () -> T
var start: (() -> Unit)? = null
var onSuccess: ((T) -> Unit)? = null
var onError: ((String) -> Unit)? = null
var onComplete: (() -> Unit)? = null
var addLifecycle: LifecycleOwner? = null
fun request() {
request(addLifecycle)
}
fun request(addLifecycle: LifecycleOwner?) {
GlobalScope.launch(context = Dispatchers.Main) {
start?.invoke()
try {
val deferred = GlobalScope.async(Dispatchers.IO, start = CoroutineStart.LAZY) {
loader()
}
addLifecycle?.apply { lifecycle.addObserver(CoroutineLifecycleListener(deferred, lifecycle)) }
val result = deferred.await()