RxJava:调用包含观察者

时间:2021-02-21 07:10:24

标签: android multithreading kotlin rx-java2 searchview

我在我创建的 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

1 个答案:

答案 0 :(得分:0)

我添加了 .map 并将顺序更改为

val queryStream = RxSearchView.queryTextChanges(searchView)
    .map { query ->
        query.toString()
    }
    .debounce(400, TimeUnit.MILLISECONDS)
    .observeOn(AndroidSchedulers.mainThread())
    

它有效

但我仍然不知道它是如何工作的