RxJava2 не работает должным образом с Firebase - PullRequest
0 голосов
/ 01 ноября 2019

Я пытаюсь получить следующее поведение в своем потоке:

  • Излучить столько объектов узлов, сколько сделок и CashTransaction в отчете XML -> работает

  • Получить идентификатор транзакции для каждого испускаемого узла -> рабочий

  • Проверка ИД транзакции Foreach, если она уже используетсяFirebaseDatabase -> Не работает

    public static Observable<Boolean> run()
    {
        return IBRepository.getInstance().getReferenceCode().flatMap((Function<String, ObservableSource<String>>)
                referenceCode -> IBRepository.getInstance().getXMLReport(referenceCode))
                .flatMap((Function<String, Observable<Boolean>>) xmlString ->
                {
                    Document xmlReport = XML.convertStringToXMLDocument(xmlString);
    
                    if(xmlReport != null)
                    {
                        return Observable.fromIterable(XML.iterable(xmlReport.getElementsByTagName(IBConstants.CashTransactionNode)))
                                .mergeWith(Observable.fromIterable(XML.iterable(xmlReport.getElementsByTagName(IBConstants.TradeNode))))
                                    .flatMap((Function<Node, ObservableSource<String>>) Task_RetrieveNewOperations::getTransactionID)
                                        .flatMap(transactionID -> FirebaseClass.getInstance().checkIfNewOperation(transactionID));
    
                    }
                    else
                    {
                        return Observable.error(new Throwable("xml report = null"));
                    }
    
                });
    

    } ​​

Я вижу, что этот метод вызывается столько раз, сколько узлов вXML-файл, поэтому я думаю, что до этого момента все в порядке.

FirebaseClass.getInstance().checkIfNewOperation(transactionID)

Затем я покажу вам этот метод:

public Observable<Boolean> checkIfNewOperation(String transactionID)
{
    return RxFirebaseDatabase.observeSingleValueEvent(operationsRef.orderByChild("TransactionID").equalTo(transactionID))
            .flatMap((Function<DataSnapshot, MaybeSource<Boolean>>) dataSnapshot -> Maybe.just(dataSnapshot.exists())).toObservable()
            .onErrorResumeNext(throwable ->
            {
                if (throwable instanceof NoSuchElementException)
                {
                    return Observable.just(true);
                }
                else
                {
                    return Observable.error(throwable);
                }
            });
}

Цель состоит в том, чтобы испустить результат этого методадля каждого ID транзакции (если идентификатор транзакции уже существует или нет). RxFirebaseDatabase.observeSingleValueEvent возвращает значение Maybe, которое в случае пустого состояния создает исключение NoSuchElementException. Я хочу пропустить это исключение и вернуть true в этом случае, потому что это означает, что идентификатор транзакции отсутствует в базе данных, а затем следуют следующие элементы.

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

Есть идеи о том, что может произойти?

...