RxJava:RxBinding

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

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 原文地址:http://gank.io/post/560e15be2dca930e00da1083 前言 我從去年...
    AFinalStone閱讀 2,225評論 5 23
  • http://blog.csdn.net/yyh352091626/article/details/5330472...
    奈何心善閱讀 3,586評論 0 0
  • 在正文開始之前的最后,放上 GitHub 鏈接和引入依賴的 gradle 代碼: Github:https://g...
    IT小魔女的故事閱讀 815評論 0 1
  • 從幼稚園到初中,跌跌撞撞認識了一個個的從不相識到打成一片的同學,相信大家都不會忘記。 但是,大家真的理解這種情...
    夢里桃花香閱讀 391評論 0 0
  • 感謝感恩于公司給到一個發揮我才能的平臺,給到一個可以允許我邊學習邊成長的平臺,同時感謝感恩我的領導,允許我自由發...
    艷敏姐閱讀 173評論 0 0