【问题标题】:Return result value with RxJava使用 RxJava 返回结果值
【发布时间】:2015-02-17 11:47:56
【问题描述】:

我想在 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 工作正常,但我注意到我不能以这种方式返回值。

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

【问题讨论】:

  • RxJava 似乎不太适合这项任务。

标签: android rx-java rx-android


【解决方案1】:

您希望它听到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 代码。

【讨论】:

  • thx,但是这种方式每次都会产生新的 observable,效果不好
猜你喜欢
  • 2015-09-06
  • 2015-07-19
  • 1970-01-01
  • 2021-05-29
  • 1970-01-01
  • 2012-10-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多