Android RxJava:获取;只有创建视图层次结构的原始线程才能接触其视图;即使在主线程上订阅之后

Android RxJava:获取;只有创建视图层次结构的原始线程才能接触其视图;即使在主线程上订阅之后,android,rx-java2,Android,Rx Java2,我正在使用autocomplete textview上的扩展函数来使用debounce策略,并在主线程上订阅 binding.autoCompleteTextView2.addRxTextWatcher() .observeOn(AndroidSchedulers.mainThread()) .subscribeOn(AndroidSchedulers.mainThread()) .debounce(400, TimeUnit.MILLIS

我正在使用autocomplete textview上的扩展函数来使用debounce策略,并在主线程上订阅

 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
                }
       }