RxJava订阅未正确取消订阅

时间:2016-06-27 09:58:08

标签: model-view-controller rx-java observable

我有一个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是一个定期生成模拟心跳频率值的类。

3 个答案:

答案 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回调,就取消订阅您的观察者。

查看此示例https://github.com/politrons/reactive/blob/master/src/test/java/rx/observables/creating/ObservableSubscription.java

答案 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