Я вроде новичок в 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
}
@MarkKeen Этот вопрос является частью более крупной проблемы, которая требует от меня реализации такого поведения. Я не упомянул другие части проблемы, чтобы упростить ее.
К сожалению, вы этого не сказали, и весь ваш вопрос сосредоточен вокруг одной конкретной реализации (код и объяснение), поэтому не знаю, как я должен знать иначе.
Рассматривали ли вы возможность использования 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
. Использование его в качестве наблюдаемого сделало свое дело
Вот пример того, как вы можете этого добиться:
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
}
}
);
}
Зачем вам за это
Observable
, похоже, вы пытаетесь использовать RxJava ради этого, а на самом деле только усложняете код и менее читабельны — методы фрагмента уже являются методами обратного вызова — работа сделана за вас. .