0

我在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。 –

回答

1

當你傳遞一個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

0

而是通過意圖傳遞可觀察到的,使用事件總線風格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 
        } 
       });