- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
当用户在 SearchView
小部件中输入内容时,应用程序应该制作一个API 调用(在后台线程中)从服务器获取搜索结果,并在 RecyclerView 中显示它们(在 UI 线程中)。
我在 fragment 中使用了以下代码:
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
inflater.inflate(R.menu.my_fragment, menu);
SearchView searchView = (SearchView) menu.findItem(R.id.action_search).getActionView();
SearchManager searchManager = (SearchManager) getActivity().getSystemService(Context.SEARCH_SERVICE);
searchView.setSearchableInfo(searchManager.getSearchableInfo(getActivity().getComponentName()));
RxSearchView.queryTextChanges(searchView)
.debounce(400, TimeUnit.MILLISECONDS)
.map(CharSequence::toString)
.switchMap(query -> retrofitService.search(query))
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Subscriber<List<Item>>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
Log.e(LOG_TAG, "Error", e);
}
@Override
public void onNext(List<Item> items) {
// adapter.addItems(...)
}
});
}
但我得到一个异常(exception):
java.lang.IllegalStateException: Must be called from the main thread. Was: Thread[RxIoScheduler-2,5,main]
at com.jakewharton.rxbinding.internal.Preconditions.checkUiThread(Preconditions.java:35)
at com.jakewharton.rxbinding.support.v7.widget.SearchViewQueryTextChangesOnSubscribe.call(SearchViewQueryTextChangesOnSubscribe.java:18)
at com.jakewharton.rxbinding.support.v7.widget.SearchViewQueryTextChangesOnSubscribe.call(SearchViewQueryTextChangesOnSubscribe.java:10)
...
当我删除 .subscribeOn(Schedulers.io())
时,会在创建 fragment 且未在 SearchView
中键入任何查询时触发搜索 API 调用,我得到异常
retrofit2.adapter.rxjava.HttpException: HTTP 422
然后,当我输入搜索查询时,retrofitService.search(query)
不再被调用。
最佳答案
请记住,您实际上可以在 rx 链中使用多个 observeOn
和多个 subscribeOn
运算符。
试试这个:
RxSearchView.queryTextChanges(searchView)
.debounce(400, TimeUnit.MILLISECONDS)
.map(CharSequence::toString)
.subscribeOn(AndroidSchedulers.mainThread())
.observeOn(Schedulers.io())
.switchMap(query -> retrofitService.search(query))
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Subscriber<List<Item>>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
Log.e(LOG_TAG, "Error", e);
}
@Override
public void onNext(List<Item> items) {
// adapter.addItems(...)
}
});
这基本上会导致线程使用:
关于java - 如何使用 SearchView、Retrofit 和 RxJava (RxBindings) 实现搜索功能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39558885/
我是新的 android 和 rxjava。我经历过很多使用 rxbindings 监听事件的例子。比如这个 RxView.clicks(b).subscribe(new Action1() {
已结束。此问题正在寻求书籍、工具、软件库等的推荐。它不满足Stack Overflow guidelines 。目前不接受答案。 我们不允许提出寻求书籍、工具、软件库等推荐的问题。您可以编辑问题,以便
试图找出为什么 RxTextView.textChanges 只发出初始值。我的理解是它应该向下游订阅发送所有新的文本更改。 这是代码 public class SignupFragment
我正在使用 RxBinding 并在 RecyclerView 适配器中的 onBindViewHolder 方法中创建一个订阅,它会重用项目。有什么简单的方法可以检查我是否已将订阅者分配给 Edit
背景 public Observable> search(SearchView searchView) { return RxSearchView.queryTextChanges(searc
这是我如何在 Kotlin 中使用 RxBinding: override fun onViewCreated(view: View?, savedInstanceState: Bundle?) {
这是我的代码: // Observable from RxView RxView.clicks(mBtnLogin) .throttleFirst(500, TimeUnit.
我正在使用 RxBindings 库中的 Focus Observable 来对焦点变化使用react。因为我想验证输入并触发动画,所以我需要两次焦点事件。 Jake Wharton 建议使用 sha
我在当前的 Android 应用程序中使用 RxBinding,并希望实现文本搜索功能。 我的代码如下:- compositeDisposable.add(RxTextView.textChangeE
我在我的项目中使用 butterknife 实现了 rxjava,如下所示: @BindView(R.id.login_et) EditText mLoginField; @BindView(R.id
我正在对 EditText 进行验证.我想要 CharSequence如果为空或不以 开头,则无效"https://" .我也在使用 接收绑定(bind) ,特别是 RxTextView .问题是当剩
我正在尝试通过一些延迟来监控文本更改,以避免来自听众的垃圾邮件。但我当然不想收到一些已经处理过的元素。 这个观察者 RxTextView.textChanges(editText)
我在 Fragment 中有一个 RecyclerView,项目点击是使用 RxJava2 处理的,如 this SO answer 中所述。 , 它在非 fragment 中工作正常。 privat
当用户在 SearchView 小部件中输入内容时,应用程序应该制作一个API 调用(在后台线程中)从服务器获取搜索结果,并在 RecyclerView 中显示它们(在 UI 线程中)。 我在 fra
我是 Rx 世界的新手,尝试使用 RxJava、RxBinding 和 实现我的 AutoCompleteTextView >改造 2。 这是我想出的麻烦:(也许我没有以正确的方式做。) 我有一个 A
我想在我的项目中为 Android UI 小部件使用 RxJava 绑定(bind) API。 因此遵循本网站的指导' https://github.com/JakeWharton/RxBinding
我是一名优秀的程序员,十分优秀!