2

我创建了一个从 edittext 发出文本的 Observable。然后在使用 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'的结果]

4

1 回答 1

1

使用与您类似的事件流对运算符进行了单独测试后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
于 2019-05-04T17:09:32.983 回答