【发布时间】:2018-09-22 10:11:45
【问题描述】:
试图从这个资源中找出一些东西:https://www.raywenderlich.com/384-reactive-programming-with-rxandroid-in-kotlin-an-introduction
我遇到了一个问题:为什么我应该在主线程中调用 subscribeOn() 而不是 Schedulers.io()?
当我进行这样的订阅时,我的应用会在几秒钟后卡住,并且我正在丢帧。
searchTextObservable
.subscribeOn(Schedulers.io())
.map { cheeseSearchEngine.search(it) }
.observeOn(AndroidSchedulers.mainThread())
.subscribe {
showResult(it)
}
然后我在主线程中订阅并在 Schedulers.io() 中观察它(我也不明白我为什么要这样做)应用程序根本没有冻结。
searchTextObservable
.subscribeOn(AndroidSchedulers.mainThread())
.observeOn(Schedulers.io())
.map { cheeseSearchEngine.search(it) }
.observeOn(AndroidSchedulers.mainThread())
.subscribe {
showResult(it)
}
谁能解释一下为什么会这样?
编辑
// 1
private fun createTextChangeObservable(): Observable<String> {
// 2
val textChangeObservable = Observable.create<String> { emitter ->
// 3
val textWatcher = object : TextWatcher {
override fun afterTextChanged(s: Editable?) = Unit
override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) = Unit
// 4
override fun onTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {
s?.toString()?.let { emitter.onNext(it) }
}
}
// 5
queryEditText.addTextChangedListener(textWatcher)
// 6
emitter.setCancellable {
queryEditText.removeTextChangedListener(textWatcher)
}
}
// 7
return textChangeObservable
}
【问题讨论】:
-
你不需要在主线程上做长时间的计算!当你想用 UI 做一些事情时,你应该只使用
AndroidSchedulers.mainThread()!否则你总是可以使用Schedulers.io() -
能否提供searchTextObservable的代码?
-
@HansWurst,我已经提供了。请在编辑下找到它。