2016-08-03 68 views
13

我學習Observer模式,我想我觀察到的跟蹤某個變量時,它改變了它的價值,並做一些操作,我已經做了一些類似:的Android Rxjava訂閱變量變化

public class Test extends MyChildActivity { 

    private int VARIABLE_TO_OBSERVE = 0; 

    Observable<Integer> mObservable = Observable.just(VARIABLE_TO_OBSERVE); 

    protected void onCreate() {/*onCreate method*/ 
     super(); 
     setContentView(); 
     method(); 
     changeVariable(); 
    } 

    public void changeVariable() { 
     VARIABLE_TO_OBSERVE = 1; 
    } 

    public void method() { 
     mObservable.map(value -> { 
      if (value == 1) doMethod2(); 
      return String.valueOf(value); 
     }).subScribe(string -> System.out.println(string)); 
    } 

    public void doMethod2() {/*Do additional operations*/} 

} 

但doMethod2()沒有被調用

+0

很久以前我離開了Java。這是我的想法。因爲'VARIABLE_TO_OBSERVE'被複制到Observable。因此,沒有觀察到。如何'私人整數VARIABLE_TO_OBSERVE = 0;'? – Danh

回答

17

生活中沒有什麼奇妙的:如果你更新一個值,你的Observable將不會被通知。你必須自己做。例如使用PublishSubject

public class Test extends MyChildActivity { 

    private int VARIABLE_TO_OBSERVE = 0; 

    Subject<Integer> mObservable = PublishSubject.create(); 

    protected void onCreate() {/*onCreate method*/ 
     super(); 
     setContentView(); 
     method(); 
     changeVariable(); 
    } 

    public void changeVariable() { 
     VARIABLE_TO_OBSERVE = 1; 
     // notify the Observable that the value just change 
     mObservable.onNext(VARIABLE_TO_OBSERVE); 
    } 

    public void method() { 
     mObservable.map(value -> { 
      if (value == 1) doMethod2(); 
      return String.valueOf(value); 
     }).subScribe(string -> System.out.println(string)); 
    } 

    public void doMethod2() {/*Do additional operations*/} 

} 
+1

我的印象是,觀察者每次觀察到對象發生變化時都會立即通知其所有訂閱者。所以基本上我們需要不斷告訴所有這些用戶,讓他們聽取任何改變? –

+1

你需要不斷告訴你所有的Observable有什麼變化。然後所有訂戶都會收到通知。 – dwursteisen

+0

我想知道如果我想從''方法'內的'map'異步返回某個東西。我的意思是'返回String.valueOf(值);'是一個異步調用。 –

7

@dwursteisen沒有什麼魔法,沒有,但我認爲我們可以得到它比多一點魔法......

如何以這種方式使用的Rx BehaviourSubject

import rx.functions.Action1; 
import rx.subjects.BehaviorSubject;  

public class BehaviourSubjectExample { 

    public BehaviourSubjectExample() { 
     subject.skip(1).subscribe(new Action1<Integer>() { 
      @Override 
      public void call(Integer integer) { 
       System.out.println("The value changed to " + integer); 
      } 
     }); 
    } 

    public final BehaviorSubject<Integer> subject = BehaviorSubject.create(0); 

    public int getValue()   { return subject.getValue(); } 
    public void setValue(int value) { subject.onNext(value);  } 
} 

如果您希望觀察代碼查看初始值,請刪除.skip(1)

變量支持保留在BehaviourSubject中,可以通過傳統的Java Getter/Setter訪問。這當然是一個玩具的例子:如果你的使用情況真的這個簡單的存在會是不只是寫沒有任何藉口:

private int value = 0; 

public int getValue() { return value; } 
public void setValue(int value) { 
    this.value = value; 
    System.out.println("The value changed to " + value); 
} 

...但使用BehaviourSubject讓您橋更改其他Rx數據在你的課堂內部創造更多高級行爲。