Es gibt Methode updateFromRemote()
:RxJava für boolean (Bedingung) warten
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;
}
}
Wie kann ich dieses Verhalten implementieren:
wenn isUpdating == true
dann warten, bis es zu false
und ausführen präsentiert Kette geändert werden.
wenn isUpdating == false
dann nur die vorgestellte Kette ausführen.
Es ist meine Lösung:
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);
}
Aber ich denke, es ist etwas falsch :)
Jede bessere Idee?
Ist es eine harte Anforderung, die Sie auf handeln lesen die Änderung von isUpdating, oder ist es möglich, eine setUpdating-Methode hinzuzufügen? Wenn Sie das können, können Sie 'onNext' auf einem' Subject'-Objekt von setUpdating aufrufen und den Betreff mit Ihrem Observable zusammenführen. –
'isUpdating' geändert durch' setUpdatingStarted() '/' setUpdatingFinished() '. Ich habe meine Frage bearbeitet, um sie einzuschließen. – Alexandr