我在负责同步的类中使用PublishSubject。完成同步后,将通知所有订户。如果出现错误,也会发生同样的情况。 我注意到下次订阅错误后,我会立即返回订阅者。
所以课程可能如下所示:
public class Synchronizer {
private final PublishSubject<Result> mSyncHeadObservable = PublishSubject.create();
private final ThreadPoolExecutor mExecutor = new ThreadPoolExecutor(1, 1,
10, TimeUnit.SECONDS,
new SynchronousQueue<Runnable>(true),
new ThreadPoolExecutor.DiscardPolicy());
public Observable<Result> syncHead(final int chunkSize) {
mExecutor.execute(new Runnable() {
@Override
public void run() {
try {
//Do some work which either returns a result or throws an error
//...
mSyncHeadObservable.onNext(Notification.createOnNext(/*some result*/));
} catch (Throwable error) {
mSyncHeadObservable.onError(Notification.<Result>createOnError(error));
}
}
});
是否有一个可以作为代理人的观察者?可能是其他一些Rx方法吗?
更新:
我已经跟随@akarnokd方法并发出包含在RxJava Notification
中的事件。然后通过flatMap()
打开它们。因此Synchronizer
类的客户不需要这样做。
//...
private PublishSubject<Notification<Result>> mSyncHeadObservable = PublishSubject.create();
public Observable<Result> syncHead(final int chunkSize) {
return mSyncHeadObservable.flatMap(new Func1<Notification<Result>, Observable<Result>>() {
@Override
public Observable<Result> call(Notification<Result> result) {
if (result.isOnError()) {
return Observable.error(result.getThrowable());
}
return Observable.just(result.getValue());
}
}).doOnSubscribe(
new Action0() {
@Override
public void call() {
startHeadSync(chunkSize);
}
});
}
private void startHeadSync(final int chunkSize) {
mExecutor.execute(new Runnable() {
@Override
public void run() {
try {
//Do some work which either returns a result or throws an error
//...
mSyncHeadObservable.onNext(Notification.createOnNext(/*some result*/));
} catch (Throwable error) {
mSyncHeadObservable.onError(Notification.<Result>createOnError(error));
}
}
});
}
//...
答案 0 :(得分:1)
我不确定您希望通过此设置实现什么,但通常,为了避免使用PublishSubject
的终端条件,您应该将值和错误包装到一个公共结构中并始终发出这些,从来没有任何onError
和onCompleted
。一种选择是使用RxJava自己的事件包装器Notification
,并且您的Subscriber
应该解包该值。
答案 1 :(得分:0)
发生错误时,observable达到终端状态。
如果您想继续观察它,您应该使用重试操作符重新订阅您,或使用其他错误handling operators