RxAndroid подписывается на изменение содержимого объектов

Я очень новый с RXJava. Я определяю несколько тем, которые должны выполнять почти одинаковые действия при инициализации, но их общие типы различны. В настоящее время мое решение выглядит так:

BehaviorSubject<PepPoint> mUpdateSubject = BehaviorSubject.create();

BehaviorSubject<String> mMessageSubject = BehaviorSubject.create();
mMessageSubject.onNext(mMessage);//type string
mMessageSubject.distinctUntilChanged().skip(1).debounce(5, TimeUnit.SECONDS).sample(1, TimeUnit.MINUTES).subscribe(this::onChanged);

BehaviorSubject<Double> mTriggerRadiusSubject = BehaviorSubject.create();
mTriggerRadiusSubject.onNext(mTriggerRadius);//type double
mMessageSubject.distinctUntilChanged().skip(1).debounce(5, TimeUnit.SECONDS).sample(1, TimeUnit.MINUTES).subscribe(this::onChanged);

BehaviorSubject<SimpleLocation> observableLocation = BehaviorSubject.create();
observableLocation.onNext(mLocation);//type Location
observableLocation.distinctUntilChanged().skip(1).debounce(5, TimeUnit.SECONDS).sample(1, TimeUnit.MINUTES).subscribe(this::onChanged);

    /*And same for many several other variables*/

Вы можете видеть, что есть много повторений. Поэтому то, что я надеюсь достичь, будет выглядеть примерно так:

{
BehaviorSubject<PepPoint> mUpdateSubject = BehaviorSubject.create();
Map<Object, BehaviorSubject> subjectMap = new TreeMap<>();
subjectMap.put(mMessage, BehaviorSubject.<String>create());
subjectMap.put(mTriggerRadius, BehaviorSubject.<Double>create());
subjectMap.put(mLocation, BehaviorSubject.<Location>create());
subjectMap.put(mPreconditions, BehaviorSubject.<List<String>>create());
subjectMap.put(mLanguage, BehaviorSubject.<String>create());

for(Map.Entry<Object, BehaviorSubject> entry:subjectMap.entrySet()){
     entry.getValue().onNext(entry.getKey());
        mMessageSubject
                .distinctUntilChanged()
                .skip(1)
                .debounce(5,TimeUnit.SECONDS)
                .subscribe(this::onChange);
    }
}

Я не понимаю, почему это не работает. Я тоже пробовал Map<? super Object, BehaviorSubject<? super Object>> subjectMap = new TreeMap<>();Предложения? Спасибо

1 ответ

Поскольку мне действительно не нужно, чтобы объекты были в коллекции, я обошел проблему, просто создав метод, который обрабатывает все то же, что и цикл for.

Решение:

public void initSubjects() {
    mUpdateSubject = BehaviorSubject.create();

    initSingleSubject(mMessage, mMessageSubject = BehaviorSubject.<String>create());
    initSingleSubject(mTriggerRadius, mTriggerRadiusSubject = BehaviorSubject.<Double>create());
    initSingleSubject(mLanguage, mLanguageSubject = BehaviorSubject.<String>create());
    initSingleSubject(mPreconditions, mPreconditionsSubject = BehaviorSubject.<List<String>>create());
    initSingleSubject(mLocation, mLocationSubject = BehaviorSubject.<SimpleLocation>create());
}

private void initSingleSubject(Object value, BehaviorSubject subject){
    subject.onNext(value);
    mUpdateSubject
            .distinctUntilChanged()
            .skip(1)
            .debounce(5,TimeUnit.SECONDS)
            .subscribe(this::onUpdate);
}
Другие вопросы по тегам