如果你的代码使用了 RxJava ObservableOnSubscribe 并且需要实现 Android SearchView 的 onQueryTextChange 方法,你会发现当文本发生变化时 onQueryTextChange 并不会触发。这是因为 onQueryTextChange 方法需要执行在主线程上,然而在 ObservableOnSubscribe 中的代码是在后台线程上执行的,导致无法在主线程上触发 onQueryTextChange。
为了解决这个问题,我们可以将 SearchView 的 setOnQueryTextListener 方法写在 subscribeOn(Schedulers.io()) 方法之外,这样就可以确保 onQueryTextChange 方法在主线程上执行。以下是一段示例代码:
SearchView searchView = findViewById(R.id.search_view);
Observable.create(new ObservableOnSubscribe() {
@Override
public void subscribe(ObservableEmitter emitter) throws Exception {
searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String query) {
emitter.onNext(query);
return true;
}
@Override
public boolean onQueryTextChange(String newText) {
emitter.onNext(newText);
return true;
}
});
}
})
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Consumer() {
@Override
public void accept(String s) throws Exception {
// Do something with the text
}
});