首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在android中使用RxJava在活动之间传递数据?

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

Stack Overflow用户
提问于 2016-09-21 14:59:38
回答 2查看 6K关注 0票数 7

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

代码语言:javascript
复制
Subject<Object, Object> subject = new SerializedSubject<>(PublishSubject.create());

MainActivity中,我有以下按钮单击处理程序:

代码语言:javascript
复制
    public void onClick(){
        startActivity(new Intent(MainActivity.this, ChildActivity.class));
        subject.onNext(new SomeEvent(data));
    }

ChildActivity中的事件侦听器订阅:

代码语言:javascript
复制
    @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在活动之间传递数据的正确方法是什么(如果可能的话)?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-09-22 14:04:41

原因:

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

修复您的问题

不要使用PublishSubject,而是使用BehaviorSubject,后者发出最近发出的项,以及当观察者订阅它时可以观察到的源的所有后续项。

浏览following link以获得更多详细信息。

票数 5
EN

Stack Overflow用户

发布于 2017-12-13 07:29:55

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

1-创建总线:

代码语言:javascript
复制
public final class RxBus {

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


public static BehaviorSubject<Object> getSubject() {
    return behaviorSubject;
}

}

2-发送者活动

代码语言:javascript
复制
                       //the data to be based
                    MyData  data =getMyData();
                    RxBus.getSubject().onNext(data) ;
                    startActivity(new Intent(MainActivity.this, AnotherAct.class));

3-接收者活动

代码语言:javascript
复制
    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-取消订阅以避免内存不足:

代码语言:javascript
复制
 @Override
protected void onDestroy() {
    super.onDestroy();
    disposable.dispose();
}
票数 12
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39620107

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档