Как передавать данные между действиями с помощью RxJava в android?
мне нужно передать данные между двумя действиями MainActivity
и ChildActivity
. Нажмите кнопку MainActivity
должны открыть ChildActivity
и событие отправки данных. У меня есть синглтон:
Subject<Object, Object> subject = new SerializedSubject<>(PublishSubject.create());
и MainActivity
у меня есть следующий обработчик нажатия кнопки:
public void onClick(){
startActivity(new Intent(MainActivity.this, ChildActivity.class));
subject.onNext(new SomeEvent(data));
}
и подписка прослушивателя событий в ChildActivity
:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addEventListeners();
}
private void addEventListeners() {
subject.ofType(SomeEvent.class)
.observeOn(AndroidSchedulers.mainThread())
.subscribeOn(Schedulers.io()).subscribe(
event -> {
loadData(event.getData());
});
}
когда я отправляю событие после запуска активности и вызова addEventListeners
на ChildActivity
onCreate
по-прежнему не подписан на это событие и loadData()
это не называется.
как правильно передавать данные между действиями с помощью RxJava (если это возможно)?
2 ответов
причина:
проблема заключается в том, что вы используете PublishSubject
. Согласно документации PublishSubject
испускает все последующие элементы источника, наблюдаемые во время подписки. Поэтому в вашем случае он будет испускать событие только в том случае, если он подписан.
исправить вашу проблему.
вместо PublishSubject
использовать BehaviorSubject
который испускает последний испущенный элемент и все последующие элементы источника, наблюдаемого, когда наблюдатель подписаться на него.
обзор следующей ссылке для получения более подробной информации.
если кому-то нужно полное решение для отправки данных между действиями с помощью RxJava2
1 - создать автобус:
public final class RxBus {
private static final BehaviorSubject<Object> behaviorSubject
= BehaviorSubject.create();
public static BehaviorSubject<Object> getSubject() {
return behaviorSubject;
}
}
2 - активность отправителя
//the data to be based
MyData data =getMyData();
RxBus.getSubject().onNext(data) ;
startActivity(new Intent(MainActivity.this, AnotherAct.class));
3-активность приемника
disposable = RxBus.getSubject().
subscribeWith(new DisposableObserver<Object>() {
@Override
public void onNext(Object o) {
if (o instanceof MyData) {
Log.d("tag", (MyData)o.getData();
}
}
@Override
public void onError(Throwable e) {
}
@Override
public void onComplete() {
}
});
});
4-отписки, чтобы избежать leacks памяти:
@Override
protected void onDestroy() {
super.onDestroy();
disposable.dispose();
}