2016-08-03 7 views
13

I Observer Muster lerne, möchte ich meine beobachtbaren Spur einer bestimmten Variablen zu halten, wenn es seinen Wert ändert und einige Operationen zu tun, ich habe getan, so etwas wie:Android Rxjava einer Variablen ändern abonnieren

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*/} 

} 

Aber doMethod2() wird nicht aufgerufen

+0

Ich habe Java vor langer Zeit verlassen. Hier ist mein Gedanke. Weil 'VARIABLE_TO_OBSERVE' in Observable kopiert wird. Daher wird es nicht beobachtet. Wie wäre es mit 'private Integer VARIABLE_TO_OBSERVE = 0; '? – Danh

Antwort

17

Nichts ist Magie im Leben: Wenn Sie einen Wert aktualisieren, wird Ihre Observable wird nicht benachrichtigt. Du musst es selbst machen. Zum Beispiel mit einem 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

Ich hatte den Eindruck, dass ein Beobachter sofort alle seine Abonnenten benachrichtigen würde, jedes Mal, wenn das Objekt Veränderungen beobachtet. Also müssen wir im Grunde all diese Abonnenten informieren, damit sie auf Änderungen hören? –

+1

Sie müssen alle Ihre Observable sagen, dass sich etwas ändert. Dann werden alle Abonnenten benachrichtigt. – dwursteisen

+0

Ich frage mich was, wenn ich asynchron etwas aus der 'map' innerhalb' method' zurückgeben möchte. Ich meine 'return String.valueOf (value);' ist ein asynchroner Aufruf. –

7

@dwursteisen Nichts ist Magie, nein, aber ich denke, dass wir es ein wenig mehr Magie als das bekommen ...

Wie wäre es ein Rx BehaviourSubject auf diese Weise mit:

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

Entfernen Sie die .skip(1), wenn der Beobachtungscode den Anfangswert anzeigen soll.

Der variable Hintergrund bleibt mit der BehaviourSubject und kann durch konventionelle Java Getter/Setter zugegriffen werden. Dies ist ein Spielzeug Beispiel natürlich: Wenn Ihr Anwendungsfall wirklich da diese einfache waren keine Entschuldigung wäre nicht nur für das Schreiben:

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

... aber die Verwendung von BehaviourSubject können Sie Brücke Änderungen an anderen Rx-Daten -Streams innerhalb Ihrer Klasse, um komplexere Verhaltensweisen zu erstellen.

Verwandte Themen