android - 使用 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 中看到任何结果。我在这里做错了什么?
解决方案
使用 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() 时不要忘记调用。
推荐阅读
- php - Laravel:如何创建一个新行并将其附加到我的模型
- php - PHP:加入两个数组
- bdd - 引诱报告中的场景
- javascript - 如何使用 jquery 设置重置选项
- sql-server - 如果变量具有任何值,则 SQL Server 中 where 子句中的 case 语句,否则比较当前
- android - Kotlin 中的 STRING_TOO_LARGE 字符串
- swift - 致命错误:意外发现 nil - 创建 UIImage 时
- r - 使用 R 中的列表计算 MACD
- angular - FormIO + Angular - 回复更改输入
- c# - Rebus & RabbitMq 似乎总是使用“RabbitTopics”交换