RxBinding2源码解析

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)
                }
            }
        }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章