我有一个MVC应用程序,我必须使用当前流的值更新视图。 在模型中我有这个方法:
public Observable<Integer> getStreamInstance(){
if(stream == null){
this.stream = Observable.create((Subscriber<? super Integer> subscriber) -> {
new HeartbeatStream(frequence,subscriber).start();
});
}
return stream;
}
我在控制器中使用它来获取流。然后,在控制器中我有这两种方法:
public void start(){
this.sb = stream.subscribe((Integer v) -> {
view.updateCurrValue(v);
});
}
public void stop(){
this.sb.unsubscribe();
}
使用start方法,我只需使用当前值更新视图中的标签。 这工作正常,直到我尝试使用取消订阅停止更新;事实上,当我按下按钮&#34;停止&#34;在视图中,标签不断更新当前值,如果我按&#34;开始&#34;再次,标签显示来自两个不同流的值,我首先使用第一个&#34; start&#34;而第二个看起来是第二次按下&#34;开始&#34;。 我哪里错了?
编辑:
public class HeartbeatStream extends Thread{
private Subscriber<? super Integer> subscriber;
private int frequence;
private HeartbeatSensor sensor;
public HeartbeatStream(int freq, Subscriber<? super Integer> subscriber){
this.frequence = freq;
this.subscriber = subscriber;
sensor = new HeartbeatSensor();
}
public void run(){
while(true){
try {
subscriber.onNext(sensor.getCurrentValue());
Thread.sleep(frequence);
} catch (Exception e) {
subscriber.onError(e);
}
}
}
这是HeartbeatStream类。 HeartbeatSensor是一个定期生成模拟心跳频率值的类。
答案 0 :(得分:2)
我猜你试图定期发出一些触发屏幕更新的事件。有一个运营商:
Observable<Long> timer = Observable.interval(period, TimeUnit.MILLISECONDS,
AndroidSchedulers.mainThread());
SerialSubscription serial = new SerialSubscription();
public void start() {
serial.set(timer.subscribe(v -> view.updateCurrValue(v)));
}
public void stop() {
serial.set(Subscriptions.unsubscribed());
}
public void onDestroy() {
serial.unsubscribe();
}
答案 1 :(得分:1)
设计可观察一旦发出所有项目并调用onComplete回调,就取消订阅您的观察者。
答案 2 :(得分:0)
我猜你没有处理unsubscribe
- 虽然我无法看到HeartbeatStream
课程中发生了什么。
如果您使用Observable
创建Observable.create
,那么您需要使用subscriber.isUnsubscribed()
明确取消订阅。
尽可能使用一些实用工具方法来创建Observable - 他们会为您处理所有这些问题,例如Observable.just()
或Observable.from()
。
如果这没有帮助,请发布您的HeartbeatStream类。
有关详细信息,请参阅文档: https://github.com/ReactiveX/RxJava/wiki/Creating-Observables https://github.com/ReactiveX/RxJava/wiki/Async-Operators