Android 理解RxJava中的CompositeDisposable+;科特林
我使用RxJava进行表单验证,以验证用户名和密码。 我的用例非常简单,如果两个字段都满足各自的条件,然后启用login按钮else来禁用它。 下面是我的代码Android 理解RxJava中的CompositeDisposable+;科特林,android,kotlin,rx-java,android-lifecycle,rx-binding,Android,Kotlin,Rx Java,Android Lifecycle,Rx Binding,我使用RxJava进行表单验证,以验证用户名和密码。 我的用例非常简单,如果两个字段都满足各自的条件,然后启用login按钮else来禁用它。 下面是我的代码 lateinit var subscriptions: CompositeDisposable private fun validateForm() { val emailObservable = viewBinding.detUserName.editText.textChangeEvents()
lateinit var subscriptions: CompositeDisposable
private fun validateForm() {
val emailObservable = viewBinding.detUserName.editText.textChangeEvents()
.skipInitialValue()
.map { isValidEmail(it.text) || isValidPhoneNumber(it.text) }
.doOnDispose {
Log.i("disposed", "emailObservable")
}
val passwordObservable = viewBinding.detPassword.editText.textChangeEvents()
.skipInitialValue()
.map { !TextUtils.isEmpty(it.text) }
.doOnDispose {
Log.i("disposed", "passwordObservable")
}
val disposable = Observable.combineLatest(emailObservable, passwordObservable,
BiFunction<Boolean, Boolean, Boolean> { t1, t2 -> t1 && t2 }).subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe {
viewBinding.bLogin.isEnabled = it
}
subscriptions.add(disposable)
}
fun isValidEmail(target: CharSequence): Boolean {
return !TextUtils.isEmpty(target) && android.util.Patterns.EMAIL_ADDRESS.matcher(target).matches()
}
fun isValidPhoneNumber(target: CharSequence): Boolean {
return !TextUtils.isEmpty(target) && Pattern.compile("(05|9665)[0-9]{8}").matcher(target).matches()
}
我的登录片段
override fun onResume() {
super.onResume()
createDisposable()
}
protected fun createDisposable() {
if (!this::subscriptions.isInitialized) {
subscriptions = CompositeDisposable()
}
}
override fun onStop() {
super.onStop()
disposeAll()
}
protected fun disposeAll() {
if (this::subscriptions.isInitialized) {
subscriptions.clear()
}
}
override fun onResume() {
super.onResume()
validateForm()
}
这是第一次可见。CombineTest工作正常,但问题是一旦应用程序进入后台并恢复,它就不会再次启动。
当它进入后台onStop()调用时,清除compositeDisposable处理所有可处置文件,当它恢复时,我正在将可处置文件的新实例重新添加到compositeDisposable中,但它仍然没有启动。
我无法找到解决此问题的方法,任何潜在客户都将不胜感激。在您的登录片段中初始化
CompositeDisposable
,将所有一次性
添加到CompositeDisposable
并在暂停时将其清除。看起来像:
private var subscriptions: CompositeDisposable = CompositeDisposable()
private fun validateForm() {
val emailObservable = viewBinding.detUserName.editText.textChangeEvents()
.skipInitialValue()
.map { isValidEmail(it.text) || isValidPhoneNumber(it.text) }
.doOnDispose {
Log.i("disposed", "emailObservable")
}
val passwordObservable = viewBinding.detPassword.editText.textChangeEvents()
.skipInitialValue()
.map { !TextUtils.isEmpty(it.text) }
.doOnDispose {
Log.i("disposed", "passwordObservable")
}
val disposable = Observable.combineLatest(emailObservable, passwordObservable,
BiFunction<Boolean, Boolean, Boolean> { t1, t2 -> t1 && t2 }).subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe {
viewBinding.bLogin.isEnabled = it
}
subscriptions.add(emailObservable, passwordObservable, disposable)
}
override fun onResume() {
super.onResume()
validateForm()
}
override fun onPause() {
subscriptions.clear()
super.onPause()
}
private-var订阅:CompositeDisposable=CompositeDisposable()
private fun validateForm(){
val emailObservable=viewBinding.detUserName.editText.textChangeEvents()
.skipInitialValue()
.map{isValidEmail(it.text)| | isValidPhoneNumber(it.text)}
杜恩迪斯波塞先生{
Log.i(“已处置”、“可观察”)
}
val passwordObservable=viewBinding.detPassword.editText.textChangeEvents()
.skipInitialValue()
.map{!TextUtils.isEmpty(it.text)}
杜恩迪斯波塞先生{
Log.i(“已处置”、“可观察密码”)
}
val disposable=可观察的.CombineTest(emailObservable,passwordObservable,
双函数{t1,t2->t1&&t2}).subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.订阅{
viewBinding.bLogin.isEnabled=it
}
订阅。添加(emailObservable、passwordObservable、一次性)
}
重写onResume(){
super.onResume()
validateForm()
}
覆盖暂停(){
订阅。清除()
super.onPause()
}
当活动开始时,是否再次调用validateForm()
?是的,我在onResume()中调用了。请检查我的编辑。您可以使用rxbinding,这非常容易实现。请看。@abonman我正在使用相同的东西,请再次检查我的代码。它的kotlin扩展是由rxbinding提供的,但我不认为这是一个问题,你测试过吗?