Как передать данные между действиями с помощью 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
до сих пор не подписан на это событие и не вызван.
Какой правильный путь пройти данные между действиями с использованием 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-отпишитесь, чтобы избежать утечек памяти:
@Override protected void onDestroy() { super.onDestroy(); disposable.dispose(); }