RxBinding源码解析
此处解析一个Click点击事件,其他组件大同小异。
RxBinding/rxbinding/src/main/java/com/jakewharton/rxbinding3/view/ViewClickObservable.kt
源码1:
@file:JvmName("RxView")
@file:JvmMultifileClass
@CheckResult //clicks点击事件是一个Unit类型Observable事件
fun View.clicks():Observable<Unit> {
//this(也就是当前被点击View)
return ViewClickObservable(this)
}
//整个方法是一个Unit类型Observable事件
private class ViewClickObservable (private val view:View):Observable<Unit> () {
//此方法在订阅时被调用,这是一个Unit类型的订阅者Observer
override fun subscribeActual(observer:Observer<in Unit>){
//不在主线程退出
if (!checkMainThread(observer)) {
return
}
//以当前被点击View和订阅者observer创建监听器
val listener = Listener(view, observer)
//产生一个Disposable,以便取消;Observer.onSubscribe(Disposable disposable)
observer.onSubscribe(listener)
//为View设置点击监听
view.setOnClickListener(listener)
}
//此监听实现了主线程的onDispose和onClick
private class Listener ( private val view:View,private val observer:Observer<in Unit>
) :MainThreadDisposable(), OnClickListener {
//当Observable.onNext()发射了数据,Observer.onNext()会同步收到数据,这里表现为收到点击事件
override fun onClick(v:View){
if (!isDisposed) {
observer.onNext(Unit)
}
}
//取消监听
override fun onDispose() {
view.setOnClickListener(null)
}
}
}
源码2 . 带xxxEvent的事件类型 由于RxJava只接收一个参数,所以将多参数封装于xxxEvent
RxBinding/rxbinding/src/main/java/com/jakewharton/rxbinding3/view/ViewScrollChangeEventObservable.kt
@file:JvmName("RxView")
@file:JvmMultifileClass
@RequiresApi(23)
@CheckResult //滚动事件
fun View.scrollChangeEvents(): Observable<ViewScrollChangeEvent> {
return ViewScrollChangeEventObservable(this)
}
//事件类型是ViewScrollChangeEvent
@RequiresApi(23)
private class ViewScrollChangeEventObservable( private val view: View
) : Observable<ViewScrollChangeEvent>() {
override fun subscribeActual(observer: Observer<in ViewScrollChangeEvent>) {
if (!checkMainThread(observer)) {
return
}
val listener = Listener(view, observer)
observer.onSubscribe(listener)
view.setOnScrollChangeListener(listener)
}
private class Listener(
private val view: View,
private val observer: Observer<in ViewScrollChangeEvent>
) : MainThreadDisposable(), OnScrollChangeListener {
//滚动事件封装的参数
override fun onScrollChange(
v: View,
scrollX: Int,
scrollY: Int,
oldScrollX: Int,
oldScrollY: Int
) {
if (!isDisposed) {
observer.onNext(ViewScrollChangeEvent(v, scrollX, scrollY, oldScrollX, oldScrollY))
}
}
override fun onDispose() {
view.setOnScrollChangeListener(null)
}
}
}