首页 > 解决方案 > 使用 RxJava Android 实现 TextWatcher

问题描述

我是 RxJava 的新手,为了学习一些基础知识,我创建了一个小项目,在其中我试图观察我的 EditText 以了解输入文本的变化并更新 TextView。

这是代码:

这些分别是我的 Observable 和 Observers 的实例变量

private Observable<String> editTextObservable;
private Observer<String> textViewObserver;

我正在使用 RxBinding 并订阅这样的文本更改:我正在这样做onCreate()

RxTextView.textChanges(etData).
            subscribe(new Action1<CharSequence>() {
        @Override
        public void call(CharSequence charSequence) {
            editTextObservable = Observable.create(new ObservableOnSubscribe<String>() {
                @Override
                public void subscribe(@NonNull ObservableEmitter<String> emitter) throws Throwable {
                    Log.d(TAG, "onTextChanged subscribe: " + etData.getText().toString());
                    emitter.onNext(etData.getText().toString());
                }
            });
        }
    });

我正在像这样更新我的 TextView:

textViewObserver = new Observer<String>() {
        @Override
        public void onSubscribe(@NonNull Disposable d) {
            Log.d(TAG, "onSubscribe: ");
        }

        @Override
        public void onNext(@NonNull String value) {
            Log.d(TAG, "onNext: ");
            tvResult.setText(value);
        }

        @Override
        public void onError(@NonNull Throwable e) {
            Log.d(TAG, "onError: ");
        }

        @Override
        public void onComplete() {
            Log.d(TAG, "onComplete: ");

        }
    };

当我运行该应用程序时,它不会给我任何错误,并且我可以在日志中看到onTextChanged()正在调用的侦听器,但是调用永远不会转到subscribe()方法,并且我无法在 TextView 中看到任何结果。我在这里做错了什么?

标签: androidrx-java2rx-android

解决方案


使用 RxBinding 库更改文本时观察的示例:

private val compositeDisposable = CompositeDisposable()   

val disposable = editText.textChanges()
                    .map(CharSequence::toString)
                    .observeOn(AndroidSchedulers.mainThread())
                    .subscribe {
                        tvResult.text = it
                    }
     compositeDisposable.add(disposable)

compositeDisposable.clear()当活动调用 onDestroy() 或片段调用 onDestroyView() 时不要忘记调用。


推荐阅读