使用RxJava返回结果值

时间:2015-02-17 11:47:56

标签: android rx-java rx-android

我想在WebView中使用RxJava实现点击debouncing 例如,用户快速点击链接,我只想点击第一次点击 首先,我认为throttleFirst对此有好处。

  private final BehaviorSubject<String> urlLoading = BehaviorSubject.create();

  private final Observable<String> throttled =  urlLoading.throttleFirst(CLICK_THROTTLE_MILLIS, TimeUnit.MILLISECONDS);  

  //...
  throttled.subscribe(new Action1<String>() {
    @Override
    public void call(String url) {
      something(url); // :/
    }
  });
  //...

  // WebView callback
  public boolean shouldOverrideUrlLoading(WebView view, String url) {
    // return something(); // original

    // i want to throttle events and return something() if it's ok or return just true for debounced events
    urlLoading.onNext(url);
    return ... ?
  }

throttleFirst工作正常,但我注意到我无法以这种方式返回价值。

问题:
当返回类型为shouldOverrideUrlLoading的方法时,如何使用RxJava返回值? 或者我不应该在这种情况下使用Rx? (换另一种方式,如Handler#postDelayed更改标志?)

1 个答案:

答案 0 :(得分:0)

您希望它听取throttled将会发出的第一次点击。

如果您想要返回boolean,则必须同步,然后阻止

使用RxJava(未经测试)可以做什么:

  • 发出something(url);结果
  • take(1)参加第一项活动
  • toBloking阻止您的RxJava流并保持同步。
  • 返回该值

示例:

 public boolean shouldOverrideUrlLoading(WebView view, String url) {

     urlLoading.onNext(url);
     return throttler
                .map(url -> something(url))
                .take(1)
                .toBlocking()
                .single();
  }

不要忘记删除您的限制器subsription代码。