[英]Operator switchMap() doesn't unsubscribe from the previous request
我创建了一个 Observable,它从 edittext 发出文本。 然后在使用 switchmap 运算符时,我创建了一个 Single 来查找文件中的匹配项。
我在这里订阅:
compositeDisposable.add(getEditTextObservable(editText)
.debounce(500, TimeUnit.MILLISECONDS)
.map(String::toLowerCase)
.filter(s -> !TextUtils.isEmpty(s))
.switchMapSingle(s -> textCutter.getSearchResult(s))
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe()
);
这是搜索:
public Single<List<TextCut>> getSearchResult(String searchRequest) {
return Single.fromCallable(() -> textGen.getCutList(searchRequest));
}
结果,我得到每个请求都是依次执行的。 例如,如果我输入查询“dog”,然后输入“cat”,结果我会同时得到“dog”和“cat”。 虽然我希望只得到“猫”
例如:
输入:狗
“狗”进行中...
输入:猫
输出: ['狗'的结果]
“猫”进行中...
输出: ['cat'的结果]
我期望得到的:
输入:狗
“狗”进行中...
输入:猫
“狗”取消了……
“猫”进行中...
输出: ['cat'的结果]
在switchMapSingle
测试了switchMapSingle
操作符后,使用了与您类似的事件流,我找不到swtichMapSingle
操作符有任何问题 - 它会在应该跳过时跳过并在应该时发出 - 我也尝试了各种线程化方法,但都很荣幸操作员功能。 其他地方肯定有问题。
测试代码运行(重要部分是从 debounce 开始,添加注释以显示预期结果):
public static void main(String... args) {
final AtomicInteger aInt = new AtomicInteger();
final AtomicBoolean aBool = new AtomicBoolean(true);
Observable.just(0)
.map(i -> {
final int i2 = i + aInt.incrementAndGet();
// simulate interval events even every 200 millis, odds every 400 millis
Thread.sleep(i2 % 2 == 0 ? 200 : 400);
return i2;
})
.repeat()
// skip all odd numbers
.debounce(300, MILLISECONDS)
.switchMapSingle(i3 ->
// toggle between 0 and 2 second delay - every 2 second delay dropped (every other even number)
Single.just(i3).delay(aBool.getAndSet(!aBool.get())? 0 : 2_000, MILLISECONDS))
.subscribeOn(Schedulers.io())
.observeOn(Schedulers.single())
// expected out - every other even number i.e 2, 6, 10, 14 ..
.subscribe(i4 -> System.out.println(String.format("Value : %d", i4)));
try {
Thread.sleep(60_000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
输出 :
Value : 2
Value : 6
Value : 10
Value : 14
Value : 18
Value : 22
Value : 26
确认在使用flatMapSingle
没有遗漏事件的输出也符合预期 - 无序排放将是switchMapSingle
丢弃的排放
使用flatMapSingle
输出:
Value : 2
Value : 6
Value : 10
Value : 4 // dropped with switch map single
Value : 14
Value : 8 // dropped with switch map single
Value : 18
Value : 12 // dropped with switch map single
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.