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

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();
}