[英]RxJava: Observing messages emitted from a socket
我還在努力學習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()
( 這是一個例子 ),但我認為這也不是正確的解決方案。 通過套接字推送的消息不完整,因為它們具有最大長度。 我需要自己“構建”消息,因此我需要在每次從套接字推送之間進行緩沖。
換句話說, 我正在尋找一種方法來自從套接字推送的數據構建消息,然后將它們推入Observable 。 我一直在尋找適當的方法來做到這一點,但我似乎找不到合適的解決方案。
具有完全可定制行為的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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.