Существует метод updateFromRemote()
:RxJava ждать булевой (условие)
public class WorkshiftSettingsDaoImpl implements WorkshiftSettingsDao {
private boolean isUpdating = false;
public Observable<WorkshiftSettings> updateFromRemote() {
return remoteDataStore.get()
.retryWhen(RxOperatorsHelpers::retryWhenAnyIoExceptionWithDelay)
.doOnSubscribe(this::setUpdatingStarted)
.doOnUnsubscribe(this::setUpdatingFinished)
.flatMap(workshiftSettings -> localDataStore.put(workshiftSettings));
}
private void setUpdatingStarted() {
if(isUpdating) throw new RuntimeException("already updating");
isUpdating = true;
}
private void setUpdatingFinished() {
if(!isUpdating) throw new RuntimeException("already finished");
isUpdating = false;
}
}
Как можно реализовать такое поведение:
если isUpdating == true
затем ждать, пока он не будет изменен на false
и выполнить представленную цепочку.
если isUpdating == false
, то просто выполните представленную цепочку.
Существует мое решение:
public Observable<WorkshiftSettings> updateFromRemote() {
Observable<WorkshiftSettings> updateRemoveDataObservable = remoteDataStore.get()
.retryWhen(RxOperatorsHelpers::retryWhenAnyIoExceptionWithDelay)
.doOnSubscribe(this::setUpdatingStarted)
.doOnUnsubscribe(this::setUpdatingFinished)
.flatMap(workshiftSettings -> localDataStore.put(workshiftSettings));
return Observable.fromCallable(() -> {
while (isUpdating) {
Thread.sleep(1000);
}
return null;
}).concatMap(o -> updateRemoveDataObservable);
}
Но я думаю, что есть что-то не так :)
Любая лучшая идея?
ли это жесткое требование, чтобы вы действовали на изменение isUpdating, или можно добавить метод setUpdating? Если вы можете вызвать «onNext» на объект «Subject» из setUpdating и объединить тему с вашим наблюдаемым. –
'isUpdating' изменен' setUpdatingStarted() '/' setUpdatingFinished() '. Я редактировал свой вопрос, чтобы включить их. – Alexandr