我想建立一个工业系统的模型,该系统由一个传送带组成,传送带上有一个传感器,用于检测物体何时使用RxJava到达某个位置。
为了模拟传感器,我有一个假类,它应该接收和对象位置,并随着时间增加它,直到它达到假定的传感器位置。然后它会通知它的观察者(传送带):
public class FakeBeltPositionSensor extends Observable<Signal>{
private double objectPosition;
protected Double sensorPosition;
public FakeBeltPositionSensor(Double sensorPosition) {
super( (s) -> {
Thread.sleep(500);
objectPosition += 1;
if(objectPosition == sensorPosition){
s.onNext(new Signal(Signal.Type.SENSOR_REACHED));
s.onCompleted();
}
});
}
public Double getSensorPosition() {
return sensorPosition;
}
public void setObjectPosition(double objectPosition){
this.objectPosition = objectPosition;
}
}
我面临的问题是,显然我无法在类构造函数中访问double objectPosition
:Cannot refer to an instance field objectPosition while explicitly invoking a constructor
。
由于扩展Observable会强制您在构造函数中实现Observable-&gt;订阅者登录,您将如何为此场景建模?
我们的想法是FakeBeltPositionSensor
可以连续运行并且能够使用setObjectPosition
更新对象位置。
答案 0 :(得分:1)
我不认为直接扩展Observable
是个好主意,除非你真的知道你在做什么。以下是其他一些需要考虑的实现(使用Subject
s):
public class FakeBeltPositionSensor {
private double objectPosition;
protected Double sensorPosition;
// or your Signal type instead of Void
private Subject<Void, Void> positionSubject = PublishSubject.<Void> create().toSerialized();
public FakeBeltPositionSensor(Double sensorPosition) {
this.sensorPosition = sensorPosition;
initPositionShift();
}
private void initPositionShift() {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
objectPosition++;
if (objectPosition == sensorPosition) {
positionSubject.onNext(null);
positionSubject.onCompleted();
}
}
public Observable<Void> positionReached() {
return positionSubject;
}
public Double getSensorPosition() {
return sensorPosition;
}
public void setObjectPosition(double objectPosition) {
this.objectPosition = objectPosition;
}
}
您必须针对您的情况进行调整:制作某些有意义类型的Subject
中继项(而不是Void
),可选择在setObjectPosition()
中添加对目标位置的检查(但请确保您没有尝试在onNext()
之后调用onCompleted()
)等。
要subscribe
更改,请使用positionReached()
。