Лучший способ избавиться от цепочки Rx с помощью оператора repeat () - PullRequest
0 голосов
/ 19 декабря 2018

Я ищу лучший способ избавиться от цепочки с циклом while (true) или оператором повтора.Проблема, с которой я столкнулся, заключается в том, что иногда, когда я располагаю цепочку и что-то еще выполняется в цепочке (например, запись в сокет), результат / исключение не доставляются.Скорее всего исключение, потому что сокет уже закрыт и запись производит SocketTimeout.

Логика: у меня есть цепочка Rx с оператором repeat ().Поток читает пакет из сокета, что-то с ним делает и записывает ответ в сокет.Цепочка расположена на службе onStop (), но иногда ответ еще не был отправлен обратно перед удалением.Это приводит к сбою моего приложения, потому что исключение не было обработано правильно.

Таким образом, есть два случая: 1. В цепочке ничего не делается, когда служба останавливается и цепочка может быть немедленно удалена.2. Сеть работает по запросу.Тем временем служба была остановлена, сокет был закрыт, но я хочу дождаться результата и затем избавиться от цепочки.

Вот мой код:

mainLoopDisposable = Single.fromCallable { readStream(packet, socketInput) }
                .map(::makeIpPacket)
                .flatMap(doSomethingWithPacekt())
                .doOnSuccess { socketOutput.write(it.rawPacket) }
                .ignoreElement()
                .retry(::retry)
                .repeat()
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe({}, ::handleError)

Спасибо за любые предложения!

...