2016-08-03 142 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数据在你的课堂内部创造更多高级行为。