【问题标题】:RxAndroid textview events called automatically before text change events在文本更改事件之前自动调用的 RxAndroid textview 事件
【发布时间】:2016-03-20 22:50:00
【问题描述】:

我使用 rxandroid 对编辑文本搜索进行去抖动操作

我用过

private void setUpText() {
        _mSubscription = RxTextView.textChangeEvents(searchStation)//
                .debounce(500, TimeUnit.MILLISECONDS)// default Scheduler is Computation
                .observeOn(AndroidSchedulers.mainThread())//
                .subscribe(getOps().getdata());
    }

和观察者作为

public Observer<TextViewTextChangeEvent> getdata()
    {

        return new Observer<TextViewTextChangeEvent>() {
            @Override
            public void onCompleted() {

            }

            @Override
            public void onError(Throwable e) {
                 e.printStackTrace();
            }

            @Override
            public void onNext(TextViewTextChangeEvent onTextChangeEvent) {
//                stationsugession(onTextChangeEvent.text().toString());

                //here i called link to get the data from the server
            }
        };
    }

我的问题是链接甚至在任何编辑文本更改发生之前就被调用了。 而且它没有调用 textchange 事件。 我错过了什么吗 我在这里做错了什么。我是 rxandroid 和 rxjava 的新手。

我用过

  compile 'io.reactivex:rxandroid:1.1.0'
    compile 'io.reactivex:rxjava:1.1.0'
    compile 'com.jakewharton.rxbinding:rxbinding:0.2.0'

编辑:

它现在可以工作了,我在获取列表的逻辑中得到了一个空指针。 当我使用 onError 方法并放置堆栈跟踪时,我发现了问题。

如果你想跳过最初的调用,那么我们应该调用 .skip(1) 到您的订阅对象。 [感谢 丹尼尔·卢 ]

上面的代码现在可以正常工作了

【问题讨论】:

  • TextViewChangeEvent 的内容是什么?
  • TextViewTextChangeEvent 是 com.jakewharton.rxbinding:rxbinding 中的一个类,用于获取我猜的 edittext 事件
  • 我知道。调用onTextChangeEvent.text() 并记录结果返回什么?
  • 它只调用了一次,第一次,我没有收到改变的事件
  • 请将该信息添加到您的问题中。

标签: android rx-java rx-android


【解决方案1】:

RxTextView.textChanges() 在发出任何更改之前发出TextView 的当前文本值。见the documentation

如果您只想对更改进行去抖动,则应添加skip(1),它将忽略初始发射:

_mSubscription = RxTextView.textChangeEvents(searchStation)
    .skip(1)
    .debounce(500, TimeUnit.MILLISECONDS)
    .observeOn(AndroidSchedulers.mainThread())
    .subscribe(getOps().getdata());

【讨论】:

  • 我也用过:RxTextView.textChangeEvents(searchStation).filter { !it.text().isEmpty() }
  • 在 rxBinding2 中(至少)你可以使用 .skipInitialValue()
  • “skip(x)”和配置更改存在细微差别。假设您在活动 onCreate 中初始化 RxTextView。如果您在“去抖动”之前放置“跳过”并且屏幕方向发生了变化,那么观察者仍然会触发。但是如果你在“去抖动”之后加上“跳过”并且方向改变了 - 那么观察者会按预期跳过初始值。
  • @Andrew 谢谢你,为你+1!我想知道为什么方向更改仍然调用文本更改事件,即使我使用了.skipInitialValue()。在切换顺序以首先调用 debounce() 然后 skip(1) 后,它的工作方式与预期的行为一样。我们要知道 .skipInitialValue() 在 debounce() 之后不是 callbale。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多