如何在活动之间传递ObservableInt?

问题描述:

我在Activity1中有一个ObservableInt,并且想通过intent将它传递给Activity2。但不管我怎么通过它,绑定到ObservableIntOnPropertyChangedCallback都会丢失。如何防止丢失?如何在活动之间传递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 :(
} 
+1

这样一个坏主意。你为什么不使用活动巴士? –

+0

谢谢。我是新来的事件公交车。我会看看它。 – Moon

+0

@ProkashSarkar事件公交范例(有点争议)被视为过时。其中最受欢迎的事件公共汽车之一Otto已被其创建者放弃以支持Reactive Streams。 –

当你传递一个Parcelable,散发出来的另一边的对象不是同一个实例。

the docs

这个类是parcelable和序列化,但是当对象被瓜分回调被忽略/序列化。

+0

但是当我将Activity中的'ObservableInt'传递给Fragment时,回调函数仍然有效。为什么?代码示例是[这里](https://stackoverflow.com/questions/44534557/passing-observableint-between-activities-the-onpropertychangedcallbacks-are-los) – Moon

+0

@Moon这是因为你使用相同的实例对象(没有包装/ unarceling完成) – pskink

+1

@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 
        } 
       });