Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/179.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 理解RxJava中的CompositeDisposable+;科特林_Android_Kotlin_Rx Java_Android Lifecycle_Rx Binding - Fatal编程技术网

Android 理解RxJava中的CompositeDisposable+;科特林

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()

我使用RxJava进行表单验证,以验证用户名和密码。 我的用例非常简单,如果两个字段都满足各自的条件,然后启用login按钮else来禁用它。 下面是我的代码


    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提供的,但我不认为这是一个问题,你测试过吗?