如何在Android中使用RxJava的活动之间传递数据?

Nat*_*sha 8 android android-activity start-activity rx-java rx-android

我需要在两个活动之间传递的一些数据MainActivityChildActivity.按钮单击MainActivity应该打开ChildActivity并发送带有数据的事件.我有单身人士:

Subject<Object, Object> subject = new SerializedSubject<>(PublishSubject.create());
Run Code Online (Sandbox Code Playgroud)

并在MainActivity我有以下按钮单击处理程序:

    public void onClick(){
        startActivity(new Intent(MainActivity.this, ChildActivity.class));
        subject.onNext(new SomeEvent(data));
    }
Run Code Online (Sandbox Code Playgroud)

和事件监听器订阅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());
                });
    }
Run Code Online (Sandbox Code Playgroud)

当我开始活动后发送事件,并呼吁addEventListenersChildActivity onCreate仍没有订阅此事件并loadData()没有被调用.

使用RxJava在活动之间传递数据的正确方法是什么(如果可能的话)?

Bis*_*Abd 8

如果有人需要一个完整的解决方案来使用RxJava2在活动之间发送数据

1-创建总线:

public final class RxBus {

private static final BehaviorSubject<Object> behaviorSubject
        = BehaviorSubject.create();


public static BehaviorSubject<Object> getSubject() {
    return behaviorSubject;
}
Run Code Online (Sandbox Code Playgroud)

}

2-发件人活动

                       //the data to be based
                    MyData  data =getMyData();
                    RxBus.getSubject().onNext(data) ;
                    startActivity(new Intent(MainActivity.this, AnotherAct.class));
Run Code Online (Sandbox Code Playgroud)

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() {

                }
            });
    });
Run Code Online (Sandbox Code Playgroud)

4-unSubscribe以避免内存泄漏:

 @Override
protected void onDestroy() {
    super.onDestroy();
    disposable.dispose();
}
Run Code Online (Sandbox Code Playgroud)


Sag*_*han 5

原因:

问题是您正在使用PublishSubject. 根据PublishSubject在订阅时发出源 Observable 的所有后续项目的文档。因此,在您的情况下,它仅在订阅时才会发出事件。

解决您的问题

当观察者订阅源 Observable 时,而不是使用PublishSubjectuse BehaviorSubjectwhich 发出最近发出的项目和源 Observable 的所有后续项目。

浏览以下链接了解更多详情。