Как передавать данные между действиями с помощью 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();
}