Model view controller RxJava订阅未正确取消订阅

Model view controller RxJava订阅未正确取消订阅,model-view-controller,rx-java,observable,Model View Controller,Rx Java,Observable,我有一个MVC应用程序,其中我必须用流的当前值更新视图。 在模型中,我有以下方法: public Observable<Integer> getStreamInstance(){ if(stream == null){ this.stream = Observable.create((Subscriber<? super Integer> subscriber) -> { new HeartbeatStream(fre

我有一个MVC应用程序,其中我必须用流的当前值更新视图。 在模型中,我有以下方法:

public Observable<Integer> getStreamInstance(){
    if(stream == null){
        this.stream = Observable.create((Subscriber<? super Integer> subscriber) -> {
            new HeartbeatStream(frequence,subscriber).start();
        }); 
    }

    return stream;
}
使用start方法,我只需使用当前值更新视图中的标签。 在我尝试通过取消订阅来停止更新之前,这一切都很正常;事实上,当我按下视图中的“停止”按钮时,标签将使用当前值不断更新,如果我再次按下“开始”,标签将显示来自两个不同流的值,第一个流是我第一次按下“开始”创建的,第二个流似乎是第二次按下“开始”创建的。 我错在哪里

编辑:

公共类HeartbeatStream扩展线程{

私人订户我猜你没有处理
取消订阅
——尽管我看不出你的
HeartbeatStream
课程中发生了什么

如果您正在使用
Observable.create
创建一个
Observable
,那么您需要使用
subscriber.isUnsubscribed()
显式处理取消订阅

在可能的情况下,使用一些实用方法来创建一个可观察的-它们为您处理所有这些,例如
Observable.just()
Observable.from()

如果这没有帮助,请发布您的HeartbeatStream课程

有关更多详细信息,请参阅文档:

我想你没有处理
取消订阅的问题,尽管我看不出你的
HeartbeatStream
课程中发生了什么

如果您正在使用
Observable.create
创建一个
Observable
,那么您需要使用
subscriber.isUnsubscribed()
显式处理取消订阅

在可能的情况下,使用一些实用方法来创建一个可观察的-它们为您处理所有这些,例如
Observable.just()
Observable.from()

如果这没有帮助,请发布您的HeartbeatStream课程

有关更多详细信息,请参阅文档:

我猜您试图定期向触发屏幕更新的某个事件发送信号。有一个操作员:

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();
}
Observable timer=Observable.interval(周期,TimeUnit.ms,
AndroidSchedulers.mainThread());
SerialSubscription serial=新的SerialSubscription();
公开作废开始(){
serial.set(timer.subscribe(v->view.updateCurValue(v));
}
公共停车场(){
serial.set(Subscriptions.unsubscripted());
}
公共空间{
serial.unsubscribe();
}

我猜您试图定期向触发屏幕更新的事件发送信号。有一个操作员:

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();
}
Observable timer=Observable.interval(周期,TimeUnit.ms,
AndroidSchedulers.mainThread());
SerialSubscription serial=新的SerialSubscription();
公开作废开始(){
serial.set(timer.subscribe(v->view.updateCurValue(v));
}
公共停车场(){
serial.set(Subscriptions.unsubscripted());
}
公共空间{
serial.unsubscribe();
}

设计可观察一旦发出所有项目并调用onComplete回调,取消订阅您的观察者


看看这个例子,一旦所有项目都发出并且调用了onComplete回调,就取消订阅您的观察者


看这个例子

我添加了heartbeatStream类我添加了heartbeatStream类
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();
}