我正在研究用于Kotlin
命令的RxKotlin
DSL的开发
我有一些工作,但我会改进我设置Rx Action
(s)和Consumer
(s)的方法。
我目前的守则类似于: -
@SequenceDsl
class ExperimentalBuilder {
companion object {
private val emptyAction = Action { }
private val emptyConsumer: Consumer<in Throwable> = Consumer { }
}
var uuid: String = ""
var onError: Consumer<in Throwable> = emptyConsumer
var onComplete: Action = emptyAction
var doFinally: Action = emptyAction
var doLoginRefreshFail: Action = emptyAction
fun build(): Experimental = Experimental(uuid, onError, onComplete, doFinally, doLoginRefreshFail)
}
import io.reactivex.Single
import io.reactivex.functions.Action
import io.reactivex.functions.Consumer
import io.reactivex.schedulers.Schedulers
data class Experimental(
val uuid: String,
val onError: Consumer<in Throwable>,
val onComplete: Action,
val doFinally: Action,
val doLoginRefreshFail: Action
) : Morpheme() {
override fun execute() {
Single.just("")
.subscribeOn(Schedulers.single())
.ignoreElement()
.doOnSubscribe {disposable -> COMPOSITE_DISPOSABLE.add(disposable) }
.doOnComplete(onComplete)
.doOnError(onError)
.doFinally(doFinally)
.doAfterTerminate(doAfterTerminate())
.subscribe()
}
}
我使用此代码如下: -
val experimental = Dsl().experimental {
uuid = "09876"
onComplete = Action {
Log.d("EXPERIMENT", "ON COMPLETE")
Log.d("EXPERIMENT", "ON COMPLETE")
}
onError = Consumer {
throwable -> Log.e("EXPERIMENT", "ON ERROR", throwable)
}
doFinally = Action {
Log.d("EXPERIMENT", "DO FINALLY")
}
doLoginRefreshFail = Action {
Log.d("EXPERIMENT", "DO LOGIN REFRESH FAIL")
}
}
experimental.execute()
Log.d("DSL", "what $experimental")
在设置Action
或Consumer
时,我想“改进”的代码是这个
onComplete = Action {
Log.d("EXPERIMENT", "ON COMPLETE")
Log.d("EXPERIMENT", "ON COMPLETE")
}
onError = Consumer {
throwable -> Log.e("EXPERIMENT", "ON ERROR", throwable)
}
这是我用来设置“onCompile”动作的唯一方法吗?
例如我是否必须提及“Action {}”或者我是否可以使用“短手”版本来获得相同的结果?
你可以在DSL中定义这样的功能
fun onComplete(onCompleteCallback: ()->Unit) {
onComplete = Action(onCompleteCallback)
}
可以像这样使用:
onComplete {
Log.d("EXPERIMENT", "ON COMPLETE")
Log.d("EXPERIMENT", "ON COMPLETE")
}
我希望不会有太多这些需要它
通常kotlin可以帮助SAM转换,但这似乎只适用于函数调用,而不是直接设置它,一旦你可以定义一个功能,你也可以确保包装正确完成也考虑做这些功能inline