如何在 android 中使用 RxJava 在 Activity 之间传递数据?
Posted
技术标签:
【中文标题】如何在 android 中使用 RxJava 在 Activity 之间传递数据?【英文标题】:How pass data between activities using RxJava in android? 【发布时间】:2017-01-29 21:55:54 【问题描述】:我需要在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());
);
当我在开始活动后发送事件并在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 中过滤数据