BitNeBolt
@BitNeBolt

Правильно ли я создал Flowable в RxJava3?

Только начал знакомиться с этим фреймворком, и чувствую себя как мартышка с очками.

В общем, мне нужен Flowable, который будет создавать объекты и передавать их наблюдателю. В документации сказано, что рекомендованный способ сейчас - использовать Flowable.create(). Как я понял, это не самый лучший способ так как перед выполнением методов слушателя нужно проверять подписан ли он.

Вот сама реализация

Flowable<Person> source = Flowable.create(new FlowableOnSubscribe<Person>() {
            @Override
            public void subscribe(@NonNull FlowableEmitter<Person> emitter) throws Throwable {
                for (int i = 0; i < 100000; i++){
                    try {
                        Person person = new Person("Name " + i, i);

                        if (!emitter.isCancelled()) {
                            emitter.onNext(person);
                        }

                    } catch (Throwable t) {
                        if (! emitter.isCancelled())
                            emitter.onError(t);
                    }
                }

                if (!emitter.isCancelled())
                    emitter.onComplete();
            }
        }, BackpressureStrategy.BUFFER)
                .subscribeOn(Schedulers.computation());



Сам слушатель должен реализовывать соответственный интерфейс. Так как мне нужно отписывать его от потока данных, то мне нужен метод для отписки, поэтому я сделал это в отдельном классе.
Сам класс

private static class FSubscriber implements FlowableSubscriber<Person>{
        private Subscription subscription;

        public void unsubscribe() {
            subscription.cancel();
        }

        @Override
        public void onSubscribe(@NonNull Subscription s) {
            this.subscription = s;
            this.subscription.request(1);

            System.out.println("On subs");
        }

        @Override
        public void onNext(Person person) {
            System.out.println("On next: " + person.toString());
            subscription.request(1);
        }

        @Override
        public void onError(Throwable t) {
            System.err.println(t.getMessage());
        }

        @Override
        public void onComplete() {
            System.out.println("On complete");
        }
    };



В итоге получается много кода, который будет использоваться каждый раз. Отсюда у меня вопросы:
  1. Правильно ли я все сделал с точки зрения пользования фреймворком?
  2. Стоит ли мне сделать абстрактный класс для, который будет родителем для всех аналогичных слушателей?
  3. Так как Flowable каждый раз должен проверять, подписан ли слушатель, то стоит ли прописать такую проверку в методы самого слушателя, как это скажется на читаемости и отлаживаемости?
  • Вопрос задан
  • 46 просмотров
Решения вопроса 1
zagayevskiy
@zagayevskiy Куратор тега Java
Android developer at Yandex
В твоём случае вообще лучше использовать Flowable.fromIterable.

Если ты реализуешь его руками, проверки на отмену можно не делать. Там под капотом они есть.

Насчёт подписчиков. Ты выбрал самый сложный путь. Смотри отсюда и вниз. Обычно используется subscribe c одним или двумя консьюмерами(onNext и onError соответственно). Тогда всю эту кучу кода тебе писать будет не надо.

Как совет - всё-таки затащи лямбды, либо взяв джаву поновее (8+) либо используй RetroLambda.
Честно, с анонимными классами Rx выглядит как полная жесть, врагу не пожелаешь.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы