相当于ReactiveCocoa的RACObserve的RxJava(或Rx.NET)

给定Java对象上的任意字段,我想创建一个Observable,它会在每次字段值发生更改时观察该字段并将新结果推送到Observer。 ReactiveCocoa有一个叫做RACObserve的宏,它看起来就是这样做的。

我想知道如何使用RxJava实现类似的功能。

例如,说我有以下简单的类:

public class Foo {
    enum State {
        Idle,
        Ready,
        Error
    }

    private State currentState = State.Idle;

    //methods that can change currentState
}

我想创建一个Observable<State> ,每次改变currentState的值时都会将新状态推送到Observer。

在ReactiveCocoa中,它看起来像我会写下类似的东西(请原谅我的伪Objective-C):

[RACObserve(self, currentState) subscribeNext:^(NSString *newState) {
    NSLog(@"%@", newState);
}];

我如何在RxJava中实现类似的功能? 我在想,我可能需要在setter中包含currentState的所有更改,但是我不清楚应该在哪里调用Observable.create以及如何将currentState的更改提供给Observer。


ReactiveCocoa实际上比Rx更类似于ReactiveUI(http://www.reactiveui.net)。 在ReactiveUI中,你可以使用this.WhenAnyValue(x => x.PropName)来完成你想要的功能。


最近我偶然发现了同样的问题,最后我使用了PropertyChangeListener,它会在属性发生变化时发出一个对象,参见以下内容:

更新监听器:

public class GameUpdateListener {

public static Observable<Object> changed(Game game) {
    final BehaviorSubject<Object> subject = BehaviorSubject.create((Object)game);

    game.addPropertyChangeListener(new PropertyChangeListener() {
        @Override
        public void propertyChange(PropertyChangeEvent propertyChangeEvent) {
          subject.onNext( (Object)propertyChangeEvent.getNewValue());
        }
    });
    return subject;
  }
}

一些自定义对象:

public class Game {
 private PropertyChangeSupport pcs = new PropertyChangeSupport(this);
...
  public setSomeField(String field){
       this.field = field;
       pcs.firePropertyChange("field", this.field, field);

}

public void addPropertyChangeListener(PropertyChangeListener propertyChangeListener) {
    pcs.addPropertyChangeListener(propertyChangeListener);
}

...

}

注意:

Game game = new Game();
GameUpdateListener listener = new GameUpdateListener();

final Observable<Object> gameObserver = listener.changed(game);

    gameObserver.subscribe(new Action1<Object>() {
        @Override
        public void call(Object o) {
            Log.e(TAG, "Object Changed");
        }
    });


game.setSomeField("New value");

只要你不需要再次实例化你的对象,这将工作得很好。 也许解决这个问题的方法是创建一个本地setter方法并在那里发布一个变化。


由于你的问题标题包含“或Rx.NET”,这里是我的建议(我不知道RxJava,你可能会发现类似的东西)。

您可能必须在制定者中利用某种机制。 .NET中的标准方式是使用INotifyPropertyChanged接口。 然后通过触发事件,可以使用Observable.FromEvent<TEvent, TArgs>()从该流创建一个IObservable<T>

你可以在这里找到一个你想做什么(.NET)的非常好的例子。

(积分给Rob Foncesa-Ensor)

链接地址: http://www.djcxy.com/p/77053.html

上一篇: RxJava (or Rx.NET) equivalent of ReactiveCocoa's RACObserve

下一篇: How to get a context menu for file system actions in Qt?