Java 如何在onError()/取消订阅之前一直观察对象

Java 如何在onError()/取消订阅之前一直观察对象,java,asynchronous,reactive-programming,rx-java,observable,Java,Asynchronous,Reactive Programming,Rx Java,Observable,我需要观察对象列表,并在列表中有新对象时立即发出事件。与客户机-服务器应用程序类似,客户机将内容添加到列表中,服务器将新添加的内容发送到服务器中注册的所有客户机 到目前为止,我的observable只发射一个项目,之后就没有了。换句话说,当一个新对象被添加到列表中时,有一个事件,但当第二个(或第三个、第四个、第五个…)对象被添加时,没有事件 当列表中有新对象时,我需要它保持发射项目 这是我的代码,其中MyList是我自己实现的List(与我的问题无关)。我希望发出的事件是新添加到MyList的对

我需要观察对象列表,并在列表中有新对象时立即发出事件。与客户机-服务器应用程序类似,客户机将内容添加到列表中,服务器将新添加的内容发送到服务器中注册的所有客户机

到目前为止,我的observable只发射一个项目,之后就没有了。换句话说,当一个新对象被添加到列表中时,有一个事件,但当第二个(或第三个、第四个、第五个…)对象被添加时,没有事件

当列表中有新对象时,我需要它保持发射项目

这是我的代码,其中
MyList
是我自己实现的
List
(与我的问题无关)。我希望发出的事件是新添加到
MyList
的对象

private void onClickMethod() {
    MyList myList = populateMyList();

    onNexAction = new Action1<MyList>() {
        @Override
        public void call(MyList myList) {
            System.out.println("call()");
            TheObject theObject = myList.getNext();
            System.out.println("New Event: " + theObject.getData());
        }
    };

    myObservable = Observable.create(new Observable.OnSubscribe<MyList>() {
        @Override
        public void call(Subscriber<? super MyList> t) {
            t.onNext(myList);
        }
    });

    myObservable.observeOn(Schedulers.newThread()).subscribeOn(Schedulers.io()).subscribe(onNexAction);
}

但这并不能解决我的问题。仅发射第一个添加的对象。

根据您的代码,当用户单击(某物)时,调用
onclick方法

此方法将创建一个对象
myList
,您将构建一个将发射此对象的项。然后您将使用此对象

事实上,您只需发出一次列表,这就是为什么您只需发出一次通知(单击一次)

为了实现您想要的目标,一种可能的方法是在添加一项时发出列表中的每一项

private void onClickMethod() {
     MyList myList = populateMyList();

     myObservable = Observable.create(subscriber -> {
               int currentSize = myList.size();
               while(myList.size() != currentSize) {
                    subscriber.onNext(myList.getNext());
                    currentSize = myList.size();
               }
               subscriber.onCompleted();
     });

   myObservable.observeOn(Schedulers.newThread())
               .subscribeOn(Schedulers.io())
               .subscribe(item -> System.out.println(item));
}

请注意,此代码性能不好,因为它将在
myList.size()
上循环,如果有人在循环代码期间添加/删除项目,您可能会遇到问题


更好的方法是在
myList
中添加新项目时收到通知,然后发出此新项目。

首先,您没有从observable中获得多个值的原因是,传递给
observable.create
的方法只调用一次,并且在首次订阅时发生。如果您想将列表连接为可观察列表,最简单的方法是使
MyList
类实现
Iterable
,您可以直接使用
from

private void onClickMethod() {
 MyList myList = populateMyList();
 Observable.from(myList)
           .observeOn(Schedulers.newThread())
           .subscribe(item -> System.out.println(item));

}

这是
PublishSubject
的典型案例:

class MyList<T> {
    final PublishSubject<T> onAdded = PublishSubject.create();
    void add(T value) {
        // add internally
        onAdded.onNext(value);
    }
    Observable<T> onAdded() {
        return onAdded;
    }
}

MyList<Integer> list = populate();

Subscription s = list.onAdded()
    .subscribe(v -> System.out.println("Added: " + v));

list.add(1);  // prints "Added: 1"
list.add(2);  // prints "Added: 2"
list.add(3);  // prints "Added: 3"

s.unsubscribe(); // not interested anymore

list.add(4);  // doesn't print anything
list.add(5);  // doesn't print anything
类MyList{
final PublishSubject onAdded=PublishSubject.create();
无效添加(T值){
//内部添加
onAdded.onNext(值);
}
可观察的onAdded(){
返回加上;
}
}
MyList=populate();
订阅s=list.onAdded()
.subscribe(v->System.out.println(“添加:+v));
列表。添加(1);//打印“添加:1”
列表。添加(2);//打印“添加:2”
列表。添加(3);//打印“添加:3”
s、 取消订阅();//不再感兴趣了
列表。添加(4);//没有打印任何东西
列表。添加(5);//没有打印任何东西

为什么不能使用Observable::distinct来完成此任务?我已经编辑了我的问题,按照您的建议添加了
distinct()
运算符,但没有任何帮助。在第一次添加对象之后,它仍然停止发送事件。这解决了我的问题,就是这样。谢谢附言您忘记关闭代码上的
系统.out.println(“添加:+v”)应该是
(“添加:+v”)另一个细节是:
onAdded()
必须返回
PublishSubject
对象。不要像在代码中那样观察到
,否则代码无法编译。谢谢)。它为我编译,您是否意外地导入了
java.util.Observable
而不是
rx.Observable
?您是正确的。我的IDE导入了错误的
可观察的
private void onClickMethod() {
 MyList myList = populateMyList();
 Observable.from(myList)
           .observeOn(Schedulers.newThread())
           .subscribe(item -> System.out.println(item));

}
class MyList<T> {
    final PublishSubject<T> onAdded = PublishSubject.create();
    void add(T value) {
        // add internally
        onAdded.onNext(value);
    }
    Observable<T> onAdded() {
        return onAdded;
    }
}

MyList<Integer> list = populate();

Subscription s = list.onAdded()
    .subscribe(v -> System.out.println("Added: " + v));

list.add(1);  // prints "Added: 1"
list.add(2);  // prints "Added: 2"
list.add(3);  // prints "Added: 3"

s.unsubscribe(); // not interested anymore

list.add(4);  // doesn't print anything
list.add(5);  // doesn't print anything