我想在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
更改标志?)
答案 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
代码。