RxAndroid FuncN ошибка компиляции / lint

У меня есть форма с 14 полями, которые должны быть действительными, прежде чем кнопка отправки будет включена.

У меня есть наблюдаемое в каждом из полей, и я использую combLatest(), чтобы убедиться, что все они действительны одновременно.

Я попробовал его с меньшим количеством аргументов, и он работает хорошо (когда я использую Func3, Func4 и т. д.).

Проблема с combLatest() заключается в том, что когда вы объединяете более 9 наблюдаемых, вы должны использовать FuncN в качестве наблюдаемого объединения. Вот пример кода:

List <Observable<Boolean>> fieldObservables = new ArrayList<Observable<Boolean>>();

fieldObservables.add(field1Observable);
fieldObservables.add(field2Observable);
fieldObservables.add(field3Observable);
fieldObservables.add(field4Observable);
fieldObservables.add(field5Observable);
fieldObservables.add(field6Observable);
fieldObservables.add(field7Observable);
fieldObservables.add(field8Observable);
fieldObservables.add(field9Observable);
fieldObservables.add(field10Observable);
fieldObservables.add(field11Observable);
fieldObservables.add(field12Observable);
fieldObservables.add(field13Observable);
fieldObservables.add(field14Observable);

Subscription formReadySubscription = Observable
        .combineLatest(fieldObservables,
                new FuncN<Boolean>() {
                    @Override
                    public Boolean call(Boolean... readyArgs) {
                        for (Boolean ready : readyArgs) {
                            if (!ready) {
                                return false;
                            }
                        }
                        return true;
                    }
                })

        .subscribe(new Observer<Boolean>() {
            @Override
            public void onCompleted() {

            }

            @Override
            public void onError(Throwable e) {

            }

            @Override
            public void onNext(Boolean formValid) {
                // TODO: enable submit button
            }
        });

Приведенный выше код дает две ошибки в FuncN:

"Anonymous is not abstract and does not override abstract method call(Object...) in FuncN" и
"Method does not override or implement a method from a supertype" для метода call().

Похоже, что метод call() FuncN<Boolean> ожидает список Object, а не Boolean. (Мне интересно, является ли это ошибкой. Я подозреваю, что Func2 (в качестве примера) определяется как Func2<Boolean, Boolean, Boolean>, где два логических значения являются параметрами, а одно из логических значений является ожидаемым возвратом от метода call() , Сохраняя этот шаблон, вы ожидаете, что объявление FuncN будет FuncN<Boolean,Boolean>.)

Кто-нибудь успешно заставил FuncN работать, и если да, то как вы это сделали? Спасибо!


person BeccaP    schedule 10.11.2015    source источник
comment
Вы пытались изменить public Boolean call(Boolean... readyArgs) { на public Boolean call(Object... readyArgs) {, а затем привести параметры к логическим значениям внутри метода?   -  person GreyBeardedGeek    schedule 10.11.2015
comment
Он компилируется! Спасибо. Это еще не совсем работает, но это может быть логическая ошибка. Я дам Вам знать.   -  person BeccaP    schedule 10.11.2015
comment
@GreyBeardedGeek Это работает хорошо. Если вы хотите поставить это как ответ, я приму это.   -  person BeccaP    schedule 16.11.2015
comment
Я столкнулся с ограничением в 16 наблюдаемых, которые можно комбинировать. Более того, это вызывает исключение, сгенерированное RxAndroid. Чтобы обойти это, вы можете объединить наблюдаемые (используя combLatest) перед добавлением их в объединение. Я проверил это, и это работает.   -  person BeccaP    schedule 17.11.2015
comment
FuncN довольно уродлив и не имеет общего параметра. Он принимает только R call(Object... args), что отстой, так как вы должны разыгрывать их потом.   -  person njzk2    schedule 17.11.2015


Ответы (1)


Изменять

public Boolean call(Boolean... readyArgs) {

to

public Boolean call(Object... readyArgs) { 

а затем приведите параметры к логическим значениям внутри метода

person GreyBeardedGeek    schedule 16.11.2015