如何在 android 中使用 RxJava 在活动之间传递数据?
How pass data between activities using RxJava in 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());
});
}
当我在 activity 开始发送事件并在 ChildActivity
中调用 addEventListeners
时 onCreate
仍然没有订阅这个事件并且 loadData()
没有被调用.
使用 RxJava 在活动之间传递数据的正确方法是什么(如果可能的话)?
原因:
问题是您正在使用 PublishSubject
。根据 PublishSubject
的文档,在订阅时发出源 Observable 的所有后续项目。因此,在您的情况下,只有订阅后才会发出事件。
解决您的问题
而不是使用 PublishSubject
使用 BehaviorSubject
当观察者订阅它时,它会发出最近发出的项目以及源 Observable 的所有后续项目。
浏览 following link 了解更多详情。
如果有人需要一个完整的解决方案来使用 RxJava2 在活动之间发送数据
1- 创建总线:
public final class RxBus {
private static final BehaviorSubject<Object> behaviorSubject
= BehaviorSubject.create();
public static BehaviorSubject<Object> getSubject() {
return behaviorSubject;
}
}
2-发件人activity
//the data to be based
MyData data =getMyData();
RxBus.getSubject().onNext(data) ;
startActivity(new Intent(MainActivity.this, AnotherAct.class));
3-接收者activity
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();
}
我需要在两个活动 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());
});
}
当我在 activity 开始发送事件并在 ChildActivity
中调用 addEventListeners
时 onCreate
仍然没有订阅这个事件并且 loadData()
没有被调用.
使用 RxJava 在活动之间传递数据的正确方法是什么(如果可能的话)?
原因:
问题是您正在使用 PublishSubject
。根据 PublishSubject
的文档,在订阅时发出源 Observable 的所有后续项目。因此,在您的情况下,只有订阅后才会发出事件。
解决您的问题
而不是使用 PublishSubject
使用 BehaviorSubject
当观察者订阅它时,它会发出最近发出的项目以及源 Observable 的所有后续项目。
浏览 following link 了解更多详情。
如果有人需要一个完整的解决方案来使用 RxJava2 在活动之间发送数据
1- 创建总线:
public final class RxBus {
private static final BehaviorSubject<Object> behaviorSubject
= BehaviorSubject.create();
public static BehaviorSubject<Object> getSubject() {
return behaviorSubject;
}
}
2-发件人activity
//the data to be based
MyData data =getMyData();
RxBus.getSubject().onNext(data) ;
startActivity(new Intent(MainActivity.this, AnotherAct.class));
3-接收者activity
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();
}