我对RxJava很陌生并对模式等有一些疑问 我正在使用以下代码创建一个observable:
public Observable<Volume> getVolumeObservable(Epic epic) {
return Observable.create(event -> {
try {
listeners.add(streamingAPI.subscribeForChartCandles(epic.getName(), MINUTE, new HandyTableListenerAdapter() {
@Override
public void onUpdate(int i, String s, UpdateInfo updateInfo) {
if (updateInfo.getNewValue(CONS_END).equals(ONE)) {
event.onNext(new Volume(Integer.parseInt(updateInfo.getNewValue(LAST_TRADED_VOLUME))));
}
}
}));
} catch (Exception e) {
LOG.error("Error from volume observable", e);
}
});
}
一切都按预期工作,但我对错误处理有一些疑问。 如果我理解正确,这将被视为一个热点可观察的事件,即无论是否有订阅都会发生事件(onUpdate是我无法控制的远程服务器使用的回调)。
我选择不在这里调用onError,因为我不希望observable在单个异常的情况下停止发出事件。是否有更好的模式可供使用?想到了.retry(),但我不确定它是否适合热观察?
此外,在创建订阅时,但在调用第一个onNext之前,如何表示observable?它只是一个Observable.empty()
答案 0 :(得分:2)
1)您的observable不是 hot 。区别因素是多个订户是否共享相同的订阅。 Observable.create()
为每个订阅者调用订阅函数,即 cold 。
虽然很容易让它热。只需添加share()
运算符即可。它将订阅第一个订阅者并取消订阅最后一个订阅者。不要忘记使用以下内容实现取消订阅功能:
event.setCancellable(() -> listeners.remove(...));
2)错误可能可恢复且无法恢复。
如果您认为错误是可自行恢复的(您不需要采取任何操作),则不应调用onError
,因为这会终止您的可观察性(不会发出其他事件)。您可以通过发送包含错误详细信息的特殊Volume
消息来通知您的订阅者。
如果错误是致命的,例如你没有添加监听器,所以没有其他消息,你不应该默默地忽略它。发出onError
因为您的观察结果无论如何都不起作用。
如果错误需要您的操作,通常是重试,或者在超时时重试,您可以添加一个retryXxx()
运算符。在create()
之后执行此操作,但在 share()
之前执行。
3)Observable
是一个subscribe()
方法的对象。它的具体表示取决于您创建它的方法。例如,请参阅create()
的源代码。