Android RxJava:获取;只有创建视图层次结构的原始线程才能接触其视图;即使在主线程上订阅之后
我正在使用autocomplete textview上的扩展函数来使用debounce策略,并在主线程上订阅Android RxJava:获取;只有创建视图层次结构的原始线程才能接触其视图;即使在主线程上订阅之后,android,rx-java2,Android,Rx Java2,我正在使用autocomplete textview上的扩展函数来使用debounce策略,并在主线程上订阅 binding.autoCompleteTextView2.addRxTextWatcher() .observeOn(AndroidSchedulers.mainThread()) .subscribeOn(AndroidSchedulers.mainThread()) .debounce(400, TimeUnit.MILLIS
binding.autoCompleteTextView2.addRxTextWatcher()
.observeOn(AndroidSchedulers.mainThread())
.subscribeOn(AndroidSchedulers.mainThread())
.debounce(400, TimeUnit.MILLISECONDS)
.subscribe {
if (!TextUtils.isEmpty(it)) {
viewModel.searchTeacher(viewModel.meditationDetails?.schoolId,it)
binding?.etEmailOfTeacher?.visible() //Crash at this point
binding?.tvEmailOfYourTeacher?.visible()
}
}
扩展功能:-
fun EditText.addRxTextWatcher(): Observable<String?> {
val flowable = Observable.create<String?> {
addTextChangedListener(object : TextWatcher {
override fun afterTextChanged(s: Editable?) {
}
override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {
it.onNext(s?.toString())
}
override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {
}
})
}
如果我在
activity?.runOnUiThread{}
中写入可见性,则其工作正常。那个么,为什么即使我订阅了主线程,我也会遇到异常呢 操作员将在计算调度程序上订阅debounce
。按如下方式重新排列函数:
binding.autoCompleteTextView2.addRxTextWatcher() <-- text watch is on the main thread
.debounce(400, TimeUnit.MILLISECONDS) <-- debounced throw the result on Computation Scheduler
.observeOn(AndroidSchedulers.mainThread()) <-- ObserveOn throw the result on MainThread
.subscribe {
if (!TextUtils.isEmpty(it)) {
viewModel.searchTeacher(viewModel.meditationDetails?.schoolId,it)
binding?.etEmailOfTeacher?.visible() //Crash at this point
binding?.tvEmailOfYourTeacher?.visible()
}
}
@小米关于默认情况下在计算调度程序上操作的
debounce
是正确的,但是为了解决问题,您必须在debounce
之后使用observeOn
操作符切换回主线程:
binding.autoCompleteTextView2.addRxTextWatcher()
.debounce(400, TimeUnit.MILLISECONDS) // debounce will operate on computation scheduler
.observeOn(AndroidSchedulers.mainThread()) // change all the operators below to operate on main thread
.subscribe {
// code here will be executed on main thread
}
}
从:
ObserveOn,影响可观察对象将在该操作符出现的下方使用的线程
看起来您只是重新排序了
subscribeOn
操作符,这不会有任何区别。根据本图中所示的:,SubscribeOn操作符指定可观察对象将在哪个线程上开始操作,无论在操作符链中的哪个点调用该操作符。另一方面,ObserveOn会影响Observable将在下面该操作符出现的位置使用的线程。
@Gustavo不好意思^^扩展函数的代码似乎不完整,请添加完整的代码好吗
...
.debounce(...)
.doOnNext{ Log.d(TAG, "Debounce on: " + Thread.currentThread().getName()) } <-- This will show RxComputationScheduler-N
.observeOn(AndroidSchedulers.mainThread())
.doOnNext{ Log.d(TAG, "Debounce on: " + Thread.currentThread().getName()) } <-- This will show main
...
binding.autoCompleteTextView2.addRxTextWatcher()
.debounce(400, TimeUnit.MILLISECONDS) // debounce will operate on computation scheduler
.observeOn(AndroidSchedulers.mainThread()) // change all the operators below to operate on main thread
.subscribe {
// code here will be executed on main thread
}
}