私のソースオブザーバブルを変更して、アプリケーションステータスがENABLEDとDISABLEDの間で切り替わるときに切断して再接続するようにしました。repeat完了をトリガーしたイベントを基にして
しかし、私のsourceObservable自体がcompleteを呼び出す状況がある場合、アプリケーションのステータスがENABLEDの場合、このトランスのrepeatWhenによってすぐに再接続されると思われます。
おそらくtakeUntilとrepeatWhenをグループ化して上から来る完全なイベントをキャッチしないようにすることで、これを解決するエレガントな方法がありますか?
N.B. applicationStatusObservableは要求に応じて最後の値を繰り返します。
ヘルプははるかに高く評価される:)
/**
* Transforms the source observable so that it defers initial subscription until the service becomes available,
* unsubscribes when the service becomes unavailable, and resubscribes when the service becomes available again.
*/
public class AvailabilityTransformer<T> implements Observable.Transformer<T, T> {
private final Observable<ApplicationStatus> applicationStatusObservable;
AvailabilityTransformer(final Observable<ApplicationStatus> applicationStatusObservable) {
this.applicationStatusObservable = applicationStatusObservable;
}
@Override
public Observable<T> call(final Observable<T> sourceObservable) {
final Observable<ApplicationStatus> applicationEnabledObservable =
applicationStatusObservable.filter(applicationStatus -> applicationStatus == ENABLED);
final Observable<ApplicationStatus> applicationDisabledObservable =
applicationStatusObservable.filter(applicationStatus -> applicationStatus != ENABLED);
return sourceObservable
.takeUntil(applicationDisabledObservable) // Unsubscribe whenever the application is disabled
.repeatWhen(repeatObservable -> repeatObservable.flatMap(repeat ->
applicationEnabledObservable.flatMap(applicationStatus -> just(repeat)))) // Resubscribe when enabled again
.delaySubscription(applicationEnabledObservable.first()); // Delay the initial subscription until the application is first enabled
}
}
applicationStatusObservableはホットまたはコールドですか?では、AvailabilityTransformerで何を達成しようとしていますか?私はそれを正しく取得しません。 –
applicationStatusObservableは、リプレイ(1).refCount()でコールドです。いずれの場合でも、常に現在のアプリケーションステータスを返します。オブザーバーがサブスクライブしている場合は、アプリケーションステータスの変更の通知を受け取ります。 考えられるのは、アプリケーションが無効になっている場合、ソースオブザーバブルサブスクリプションをキャンセルすることです。再び有効になると、観測可能なソースに再登録されます。 –
OperatorTakeUntilとOnSubscribeDelayなどの実装を調べると、TransformerではなくOperatorとしてこれを書く方がおそらくもっと適していると思います。 –