如何在活动之间传递ObservableInt?
我在Activity1中有一个ObservableInt
,并且想通过intent将它传递给Activity2。但不管我怎么通过它,绑定到ObservableInt
的OnPropertyChangedCallback
都会丢失。如何防止丢失?如何在活动之间传递ObservableInt?
// 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
}
//Activity1
private ObservableInt var = new Observable(0);
protected void onCreate(Bundle savedInstanceState) {
var.addOnPropertyChangedCallback(callback1);
var.set(1); // fires callback1
Fragment1 frag = Fragment1.newInstance(var); // instantiates Fragment1
// inflate some layout with frag
}
public void goToActivity2 (View view) {
Intent intent = new Intent(this, goToActivity2.class);
intent.putExtra("VAR", var);
startActivity(intent);
}
// Fragment1
public static Fragment1 newInstance(ObservableInt var) {
Bundle args = new Bundle();
args.putSerializable("VAR", var);
Fragment1 fragment = new Fragment1();
fragment.setArguments(args);
return fragment;
}
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
ObservableInt var = (ObservableInt) getArguments().getSerializable("VAR");
var.addOnPropertyChangedCallback(callback2);
var.set(2); // fires callback1 and callback2
}
//Activity2
protected void onCreate(Bundle savedInstanceState) {
ObservableInt var= (ObservableInt) getIntent().getSerializableExtra("VAR");
var.addOnPropertyChangedCallback(callback3);
var.set(3); // only fires callback3 :(
}
但是当我将Activity中的'ObservableInt'传递给Fragment时,回调函数仍然有效。为什么?代码示例是[这里](https://stackoverflow.com/questions/44534557/passing-observableint-between-activities-the-onpropertychangedcallbacks-are-los) – Moon
@Moon这是因为你使用相同的实例对象(没有包装/ unarceling完成) – pskink
@pskink我认为有序列化/反序列化从函数'newInstance'到'onCreateView'。我错了吗? – Moon
而是通过意图传递可观察到的,使用事件总线风格RxJava:
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;
}
}
要通过可观察到的从活性1,
private ObservableInt var = new ObservableInt(0);
var.addOnPropertyChangedCallback(callback1);
RxEventBus.getInstance().sendBusObservable(var);
从活性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
}
});
这样一个坏主意。你为什么不使用活动巴士? –
谢谢。我是新来的事件公交车。我会看看它。 – Moon
@ProkashSarkar事件公交范例(有点争议)被视为过时。其中最受欢迎的事件公共汽车之一Otto已被其创建者放弃以支持Reactive Streams。 –