RxJava CombineLatest оператор срабатывает только один раз - PullRequest
0 голосов
/ 22 мая 2018

Я только начал работать с MVVM, и застрял в этой странной ситуации, когда оператор combineLatest, применяемый для проверки формы, запускается только один раз.

Я использовал combLatest на editTextFileds в MVC и имелникогда не сталкивался с этой проблемой.Любая помощь приветствуется.

Мой класс ModelView

    public class LoginModel extends BaseObservable {

        public final ObservableField<String> username = new ObservableField<>("");
        public final ObservableField<String> password = new ObservableField<>("");
        public final ObservableField<Boolean> emailError = new ObservableField<>(false);
        public final ObservableField<Boolean> passwordError = new ObservableField<>(false);
public final ObservableField<Boolean> buttonState = new ObservableField<>(false);


        public LoginModel() {
            Observable<Boolean> result = Observable.combineLatest(FieldUtils.toObservable(username), FieldUtils.toObservable(password), new BiFunction<String, String, Boolean>() {

                @Override
                public Boolean apply(String s, String s2) throws Exception {
                      emailError.set(isValidateEmail(s));
                      passwordError.set(isValidPassword(s2));
                    Log.e("Triggered", String.valueOf(isValidateEmail(s) && isValidPassword(s2)));
                    return !(isValidateEmail(s) && isValidPassword(s2));
                }
            });



 result.observeOn(Schedulers.io()).subscribeOn(AndroidSchedulers.mainThread()).subscribe(new Observer<Boolean>() {
                @Override
                public void onSubscribe(Disposable d) {

                }

                @Override
                public void onNext(Boolean aBoolean) {
                    Log.e("Result", String.valueOf(aBoolean));
                    buttonState.set(aBoolean);

                }

                @Override
                public void onError(Throwable e) {

                }

                @Override
                public void onComplete() {

                }
            });

        }


        private boolean isValidateEmail(String email) {
            String emailPattern = "[a-zA-Z0-9._-]+@[a-z]+\\.+[a-z]+";
            return (email.matches(emailPattern) && !TextUtils.isEmpty(email));
        }

        private boolean isValidPassword(String password) {
            return (!TextUtils.isEmpty(password) && password.length() > 4);
        }

    }

apply() метод не запускается даже при изменении полей ввода

Мой XML-файл

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools">

    <data>

        <variable
            name="user"
            type="delivery.restro.com.ViewModel.LoginModel" />
    </data>

    <RelativeLayout
        android:id="@+id/parent"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@mipmap/background"
        tools:ignore="MissingPrefix">

        <!--<include layout="@layout/no_internet" />-->


        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_centerHorizontal="true"
            android:layout_centerVertical="true"
            android:layout_margin="@dimen/Margin_Extra_Large"
            android:orientation="vertical">

            <ImageView
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginBottom="@dimen/activity_horizontal_margin"
                android:src="@mipmap/logo" />

            <EditText
                android:id="@+id/phone"
                android:layout_width="match_parent"
                android:layout_height="@dimen/button_height"
                android:layout_marginBottom="@dimen/activity_horizontal_margin"
                android:background="@drawable/white_view_radius"
                android:hint="@string/editText_hint_phone"
                android:inputType="textEmailAddress"
                android:paddingLeft="@dimen/activity_horizontal_margin"
                android:paddingRight="@dimen/activity_horizontal_margin"
                android:text="@{user.username}"
                android:textColor="@android:color/black"
                android:textColorHint="@color/colorDarkGrey"
                app:error="@{user.emailError?@string/error_invalid_email:null}" />
            <!--app:error="@{user.emailError==true?@string/error_invalid_email:null}" />-->

            <EditText
                android:id="@+id/password"
                android:layout_width="match_parent"
                android:layout_height="@dimen/button_height"
                android:layout_marginBottom="@dimen/activity_horizontal_margin"
                android:background="@drawable/white_view_radius"
                android:hint="@string/editText_hint_password"
                android:inputType="textPassword"
                android:paddingLeft="@dimen/activity_horizontal_margin"
                android:paddingRight="@dimen/activity_horizontal_margin"
                android:text="@{user.password}"
                android:textColor="@android:color/black"
                android:textColorHint="@color/colorDarkGrey"
                app:error="@{user.passwordError?@string/error_invalid_password:null}" />

            <Button
                android:id="@+id/login"
                android:layout_width="match_parent"
                android:layout_height="@dimen/button_height"
                android:background="@drawable/button_yellow"
                android:enabled="@{user.buttonState}"
                android:text="@string/text_login"
                android:textColor="@android:color/black" />


        </LinearLayout>


    </RelativeLayout>
</layout>

1 Ответ

0 голосов
/ 25 мая 2018

Я думаю, что есть более простой способ использовать Комбинировать оператор Last с текстовыми полями, используя RxBinding , и нет необходимости наблюдать в другом потоке, это нужно толькопри выполнении тяжелых операций, таких как выборка данных с сервера, выполнение запросов к базе данных и т. д. Об этом можно прочитать в следующих статьях

RxBinding

Реактивные формы сRxAndroid

...