我还在努力学习RxJava。有一件事我现在无法绕过头脑。每一篇试图了解我如何使用Rx的文章都向我展示了如何基于已经“可预测”的源创建Observable,即一组项目的序列(单个值,或者,例如,一个简单的Iterable)
大多数情况下,您会看到Observable.just()
Observable<String> observerable = Observable.just("Hello, world!");
或Observable.from()
:
Observable.from("apple", "orange", "banana").subscribe(fruit -> System.out.println(fruit));
这一切都很好,但下面的用例呢?
我有不断通过套接字推送的消息(我没有构建它,我只是集成)。我需要“观察”通过套接字推送的数据序列。
许多人似乎都指向Obserable.using()
(Here's an example),但我认为这也不是正确的解决方案。通过套接字推送的消息不完整,因为它们具有最大长度。我需要自己“构建”消息,所以我需要在套接字的每次推送之间进行缓冲。
换句话说,我正在寻找一种方法来自从套接字推送的数据构建消息,然后将它们推送到Observable 。我一直在寻找适当的方法来做到这一点,但我似乎找不到合适的解决方案。
答案 0 :(得分:4)
具有完全可自定义行为的Observable
呢?
Observable.create(subscriber -> {
Socket socket = getSocket();
socket.subscribe(new SocketListener() {
@Override public void onNewFrame(Frame frame) {
// Process frame and prepare payload to the subscriber.
if (payloadReadyForExternalObserver) {
if (subscriber.isUnsubscribed()) {
// Subscriber unsubscribed, let's close the socket.
socket.close();
} else {
subscriber.onNext(payload);
}
}
}
@Override public void onSocketError(IOException exception) {
subscriber.onError(exception); // Terminal state.
}
@Override public void onSocketClosed() {
subscriber.onCompleted(); // Terminal state.
}
});
})
但请确保正确实施Observable合约,有关详细信息,请阅读https://github.com/ReactiveX/RxJava/wiki/Implementing-Your-Own-Operators