如何在 android 中使用 RxJava 在 Activity 之间传递数据?

Posted

技术标签:

【中文标题】如何在 android 中使用 RxJava 在 Activity 之间传递数据?【英文标题】:How pass data between activities using RxJava in android? 【发布时间】:2017-01-29 21:55:54 【问题描述】:

我需要在MainActivityChildActivity 两个活动之间传递一些数据。单击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());
                );
    

当我在开始活动后发送事件并在ChildActivity 中调用addEventListeners 时,onCreate 仍然没有订阅这个事件并且loadData() 没有被调用。

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

【问题讨论】:

也许你可以使用行为主题而不是发布主题,它保留最后几个事件并在新订阅时立即发出它们。 @SagarTrehan 是的,它解决了我的问题。您可以添加对此问题的答案而不是评论吗? 很高兴它可以帮助您解决问题。我已经发布了我的答案 Intents 有什么问题吗? 【参考方案1】:

如果有人需要一个完整的解决方案来使用 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();

【讨论】:

@Bishboy Abd 你需要调用subscription.unsubscribe() 方法吗? 当接收器活动再次开始onNext再次调用时,我调用了dispose()方法onDestroy()。【参考方案2】:

原因:

问题是您使用的是PublishSubject。根据PublishSubject 的文档,在订阅时会发出源 Observable 的所有后续项目。所以在你的情况下,它只会在订阅时发出事件。

解决您的问题

不要使用PublishSubject,而是使用BehaviorSubject,它会在观察者订阅源 Observable 时发出最近发出的项目和所有后续项目。

浏览following link了解更多详情。

【讨论】:

以上是关于如何在 android 中使用 RxJava 在 Activity 之间传递数据?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Rxjava 在 Android Kotlin 中过滤数据

RxJava 在Android中的应用

RxJava入门系列四,Android中的响应式编程

Android RxJava小结

Android架构中添加AutoDispose解决RxJava内存泄漏

何时在 Android 中使用 RxJava,何时使用 Android 架构组件中的 LiveData?