Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/388.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在活动之间传递可观性?_Java_Android_Android Activity_Observable_Android Databinding - Fatal编程技术网

Java 如何在活动之间传递可观性?

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) {

我在Activity1中有一个
可观察到的
,并希望将其通过意图传递给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我以为有从函数newInstanceonCreateView的序列化/反序列化。我错了吗?扩展你的
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
                    }
                });