我在我创建的 SearchView
中实现了 RxJava/RxBinding。这是代码
val queryStream = RxSearchView.queryTextChanges(searchView)
.observeOn(AndroidSchedulers.mainThread())
.debounce(400, TimeUnit.MILLISECONDS)
queryStream.subscribe({
if (it.isNotEmpty()) {
Log.e("queryStream", "ini querynya ${it}")
getSearchUser(it.toString())
}
}, {
// Exception
Log.e("Exception", "${it.message}")
})
这是getSearchUser()
函数的代码
private fun getSearchUser(q: String) {
viewModel.getSearchUser(q).observe(this, { user ->
if (user != null) {
when (user) {
is Resource.Loading -> binding.progressBar.visibility = View.VISIBLE
is Resource.Success -> {
binding.progressBar.visibility = View.GONE
adapter.setData(user.data)
}
is Resource.Error -> {
binding.progressBar.visibility = View.GONE
binding.viewError.root.visibility = View.VISIBLE
binding.viewError.tvError.text =
user.message ?: getString(R.string.something_wrong)
}
}
}
})
}
问题是在 getSearchUser
块内调用的 subscribe
函数导致了这个错误
Exception: Cannot invoke observe on a background thread
我应该怎么做才能解决这个问题?
谢谢
注意:我使用 jakewharton.rxbinding2
作为 SearchView
答案 0 :(得分:0)
我添加了 .map
并将顺序更改为
val queryStream = RxSearchView.queryTextChanges(searchView)
.map { query ->
query.toString()
}
.debounce(400, TimeUnit.MILLISECONDS)
.observeOn(AndroidSchedulers.mainThread())
它有效
但我仍然不知道它是如何工作的