Photo by Peter Hershey on Unsplash
學無止境
添加依賴
RxBinding庫是根據其所支持控件在Android平臺的位置而單獨分離的。
//Platform bindings:
compile 'com.jakewharton.rxbinding2:rxbinding:2.0.0'
//'support-v4' library bindings:
compile 'com.jakewharton.rxbinding2:rxbinding-support-v4:2.0.0'
//'appcompat-v7' library bindings:
compile 'com.jakewharton.rxbinding2:rxbinding-appcompat-v7:2.0.0'
//'design' library bindings:
compile 'com.jakewharton.rxbinding2:rxbinding-design:2.0.0'
//'recyclerview-v7' library bindings:
compile 'com.jakewharton.rxbinding2:rxbinding-recyclerview-v7:2.0.0'
//'leanback-v17' library bindings:
compile 'com.jakewharton.rxbinding2:rxbinding-leanback-v17:2.0.0'
應用示例:
按鈕的長按 / 點擊時間監聽
RxView.longClicks(mButton)//長按
// .clicks(mButton)//點擊
.subscribe(new Consumer<Object>() {
@Override
public void accept(Object o) throws Exception {
Log.d("flag", "長按點擊了!");
}
});
Button 防抖處理
RxView.clicks(mButton)
//兩秒鐘之內只取第一個點擊事件,防抖操作
.throttleFirst(2, TimeUnit.SECONDS)
.subscribe(new Consumer<Object>() {
@Override
public void accept(Object o) throws Exception {
Log.d("flag", "點擊了!");
}
});
實現原理
以RxView.clicks()
為例,clicks()
源碼如下所示,
@CheckResult @NonNull
public static Observable<Object> clicks(@NonNull View view) {
checkNotNull(view, "view == null");
return new ViewClickObservable(view);
}
返回一個ViewClickObservable
對象,參數是傳入的view,然后來學習一下ViewClickObservable
這個類,
final class ViewClickObservable extends Observable<Object> {
private final View view;
ViewClickObservable(View view) {
this.view = view;
}
@Override protected void subscribeActual(Observer<? super Object> observer) {
if (!checkMainThread(observer)) {
return;
}
Listener listener = new Listener(view, observer);
observer.onSubscribe(listener);
view.setOnClickListener(listener);
}
static final class Listener extends MainThreadDisposable implements OnClickListener {
private final View view;
private final Observer<? super Object> observer;
Listener(View view, Observer<? super Object> observer) {
this.view = view;
this.observer = observer;
}
@Override public void onClick(View v) {
if (!isDisposed()) {
observer.onNext(Notification.INSTANCE);
}
}
@Override protected void onDispose() {
view.setOnClickListener(null);
}
}
}
首先看是Listener
這個類,它繼承了MainThreadDisposable
并且實現了OnClickListener
,在onClick()
中訂閱者對這個事件進行了回調。同時onDispose()
中停止對view的監聽;
而真正的訂閱發生在在subscribeActual()
中,listener
訂閱了上游的observer,并且設置了view的監聽事件;
除此之外,textChanges()
,longClicks()
也是類似這樣進一步的封裝;
對于RxJava的學習才剛剛開始!
RxJava:RxBus事件總線
RxJava:RxBinding
RxJava:Rxlifecycle