Java 如何在活动之间传递可观性?
我在Activity1中有一个Java 如何在活动之间传递可观性?,java,android,android-activity,observable,android-databinding,Java,Android,Android Activity,Observable,Android Databinding,我在Activity1中有一个可观察到的,并希望将其通过意图传递给Activity2。但无论我如何传递它,绑定到可观测对象的OnPropertyChangedCallback都会丢失。如何防止丢失 // Activity1 private ObservableInt var = new ObservableInt(0); var.addOnPropertyChangedCallback(callback1); public void goToActivity2(View view) {
可观察到的
,并希望将其通过意图传递给Activity2。但无论我如何传递它,绑定到可观测对象的OnPropertyChangedCallback
都会丢失。如何防止丢失
// Activity1
private ObservableInt var = new ObservableInt(0);
var.addOnPropertyChangedCallback(callback1);
public void goToActivity2(View view) {
var.set(1); // fires callback1
Intent intent = new Intent(getContext(), Activity2.class);
// first way to pass ObservableInt
intent.putExtra("VAR", (Parcelable) var);
// second way to pass ObservableInt
Bundle bundle = new Bundle();
bundle.putParcelable("VAR", var);
intent.putExtras(bundle);
startActivity(intent);
}
// Activity2
protected void onCreate(Bundle savedInstanceState) {
ObservableInt a = getIntent().getParcelableExtra("VAR");
Bundle bundle = getIntent().getExtras();
ObservableInt b = bundle.getParcelable("VAR");
a.set(2); // cannot fire callback1
b.set(3); // cannot fire callback1
}
当您传递一个包裹时
,从另一侧出来的对象不是同一个实例
Per:
此类是可打包和可序列化的,但当对象被打包/序列化时,将忽略回调
使用RxJava的事件总线样式,而不是通过Intent传递可观察的:
public class RxEventBus {
private static RxEventBus instance;
private PublishSubject<Observable> observable_bus = PublishSubject.create();
public static RxEventBus getInstance() {
if (instance == null) {
instance = new RxEventBus();
}
return instance;
}
public void sendBusObservable(Observable observable_bus) {
observable_bus.onNext(observable_bus);
}
public Observable<Observable> getBusObject() {
return observable_bus;
}
}
从活动2订阅数据更改
RxEventBus rxEventBus = RxEventBus.getInstance();
rxEventBus.getBusObject()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(a -> {
if (a instanceof Observable) {
Observable observable = (Observable) a;
// do the rest with received observable
}
});
真是个坏主意。你为什么不用活动巴士?谢谢。我是新来的活动巴士。我来看看。@ProkashSarkar事件总线范式(有点争议)被认为是过时的。最受欢迎的活动巴士之一,Otto,已经被它的创造者抛弃,取而代之的是反应流。@KevinKrumwiede感谢您的澄清。我不是建议用奥托之类的东西。我们还可以使用RxJava创建事件总线风格的方法。签出我发布的答案。但是当我将observativeint
从活动传递到片段时,回调仍然有效。为什么?代码示例是@Moon这是因为您使用的是同一个实例对象(没有进行打包/解包)@pskink我以为有从函数newInstance
到onCreateView
的序列化/反序列化。我错了吗?扩展你的observeInt
并重写writeToParcel
方法调用super.writeToParcel
和一些Log.d
,你就会看到你的类何时被激活parceled@Moon这就是我所期望的。实际上,我更倾向于怀疑,当你把ObservableInt
传递给片段时,callback1
不是在你思考时被调用,就是不是因为你思考的原因被调用。很难说没有看到更多的代码。您能否创建一个演示问题的最小完整示例?
private ObservableInt var = new ObservableInt(0);
var.addOnPropertyChangedCallback(callback1);
RxEventBus.getInstance().sendBusObservable(var);
RxEventBus rxEventBus = RxEventBus.getInstance();
rxEventBus.getBusObject()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(a -> {
if (a instanceof Observable) {
Observable observable = (Observable) a;
// do the rest with received observable
}
});