學(xué)無止境
添加依賴
RxBinding庫是根據(jù)其所支持控件在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'
應(yīng)用示例:
按鈕的長按 / 點擊時間監(jiān)聽
RxView.longClicks(mButton)//長按
// .clicks(mButton)//點擊
.subscribe(new Consumer<Object>() {
@Override
public void accept(Object o) throws Exception {
Log.d("flag", "長按點擊了颅湘!");
}
});
Button 防抖處理
RxView.clicks(mButton)
//兩秒鐘之內(nèi)只取第一個點擊事件胯甩,防抖操作
.throttleFirst(2, TimeUnit.SECONDS)
.subscribe(new Consumer<Object>() {
@Override
public void accept(Object o) throws Exception {
Log.d("flag", "點擊了!");
}
});
實現(xiàn)原理
以RxView.clicks()
為例,clicks()
源碼如下所示戳杀,
@CheckResult @NonNull
public static Observable<Object> clicks(@NonNull View view) {
checkNotNull(view, "view == null");
return new ViewClickObservable(view);
}
返回一個ViewClickObservable
對象步做,參數(shù)是傳入的view,然后來學(xué)習(xí)一下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
并且實現(xiàn)了OnClickListener
,在onClick()
中訂閱者對這個事件進(jìn)行了回調(diào)灵临。同時onDispose()
中停止對view的監(jiān)聽截型;
而真正的訂閱發(fā)生在在subscribeActual()
中,listener
訂閱了上游的observer儒溉,并且設(shè)置了view的監(jiān)聽事件宦焦;
除此之外,textChanges()
顿涣,longClicks()
也是類似這樣進(jìn)一步的封裝波闹;
對于RxJava的學(xué)習(xí)才剛剛開始!
RxJava:RxBus事件總線
RxJava:RxBinding
RxJava:Rxlifecycle