web-dev-qa-db-ja.com

テキスト変更イベントの前に自動的に呼び出されるRxAndroidテキストビューイベント

エディットテキスト検索のデバウンス操作に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'

編集:

これで動作するようになりました。リストを取得するためのロジックでnullポインターを取得していました。onErrorメソッドを使用してスタックトレースを配置すると、問題が見つかりました。

また、最初の呼び出しをスキップする場合は、サブスクリプションオブジェクトに対して。skip(1)を呼び出す必要があります。 [ありがとうDaniel Lew]

上記のコードは現在完全に機能しています

14
George Thomas

RxTextView.textChanges()は、変更を発行する前に、TextViewの現在のテキスト値を発行します。 ドキュメント を参照してください。

変更のみをデバウンスする場合は、skip(1)を追加する必要があります。これにより、最初の放出が無視されます。

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