Как подписаться на Observable, который генерирует какую-то другую часть кода?

Я вроде новичок в RxJava. У меня есть следующая проблема. У меня есть Presenter и Fragment. Я создаю Presenter внутри onCreate Фрагмента. Я хочу подписаться на Observable в конструкторе Presenter. И этот Observable должен испускаться, когда срабатывает фрагмент onViewCreated (который вызывает какой-то метод в Presenter, то есть onViewReady). Проблема, с которой я сталкиваюсь, заключается в том, что когда я создаю Observable (в конструкторе Presenter), мне также нужно передать эмиттер. Как я могу подписаться на observable в конструкторе и позже испускать внутри onViewReady?

Я попытался найти кучу ссылок StackOverflow и Medium. Кажется, что все они всегда проходят через эмиттер во время создания Observable.

Фрагмент

@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
    // create presenter
}

@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
    // call presenter.onViewReady
}

Ведущий

Presenter() {
    // create and subscribe to observable
}

public void onViewReady() {
    // emit observable
}

Зачем вам за это Observable, похоже, вы пытаетесь использовать RxJava ради этого, а на самом деле только усложняете код и менее читабельны — методы фрагмента уже являются методами обратного вызова — работа сделана за вас. .

Mark 29.05.2019 19:41

@MarkKeen Этот вопрос является частью более крупной проблемы, которая требует от меня реализации такого поведения. Я не упомянул другие части проблемы, чтобы упростить ее.

Saim Malik 29.05.2019 21:45

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

Mark 29.05.2019 22:05
1
3
483
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Рассматривали ли вы возможность использования Subject?

Код фрагмента:

public Subject<Integer> subject = PublishSubject.create()

@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
    presenter = new Presenter(subject);
}

@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
    subject.onNext(1);
}

Код докладчика:

Presenter(Subject<Integer> subject) {
    subject.doOnNext(i -> onViewReay()).subscribe();
}

public void onViewReady() {
    // code here...
}

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

и я пробовал это только в RxJava2. поэтому, если вы используете RxJava1, могут потребоваться некоторые дополнительные настройки.

Спасибо. Я не знал о Subject. Использование его в качестве наблюдаемого сделало свое дело

Saim Malik 29.05.2019 21:43

Вот пример того, как вы можете этого добиться:

private final Observable<MyClass> myObservable;

Presenter() {
    // create observable
    myObservable = Observable.create(new Action1<Emitter<MyClass>>() {
        @Override
        public void call(Emitter<MyClass> emitter) {
            // Emit here
            emitter.onNext(...);
            emitter.onNext(...);

            emitter.onCompleted();
        }
    });
}

public void onViewReady() {
    // subscribe to the observable
    myObservable.subscribeOn(Schedulers.computation())
                .observeOn(AndroidSchedulers::mainThread)
                .subscribe(
                        new Action1<MyClass>() {
                            @Override
                            public void call(MyClass mc) {
                                // TODO implement
                            }
                        },
                        new Action1<Throwable>() {
                            @Override
                            public void call(Throwable throwable) {
                                // TODO implement
                            }
                        }
                );
}

Другие вопросы по теме