1

我想在 WebView 中使用 RxJava 实现点击去抖动。
例如,用户快速点击链接,我只想处理第一次点击。
首先,我认为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工作正常,但我注意到我不能以这种方式返回值。

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

4

1 回答 1

0

您希望它听到的第一次点击throttled会发出什么。

当你想返回 aboolean时,你必须是同步的,然后是阻塞的。

使用 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代码。

于 2015-02-19T14:14:49.850 回答