Java RxAndroid订阅对象内容更改
我对RXJava非常陌生。 我定义了多个主题,它们在初始化时需要做几乎相同的事情,但它们的泛型类型不同。 目前,我的解决方案如下所示:Java RxAndroid订阅对象内容更改,java,generics,wildcard-mapping,Java,Generics,Wildcard Mapping,我对RXJava非常陌生。 我定义了多个主题,它们在初始化时需要做几乎相同的事情,但它们的泛型类型不同。 目前,我的解决方案如下所示: BehaviorSubject<PepPoint> mUpdateSubject = BehaviorSubject.create(); BehaviorSubject<String> mMessageSubject = BehaviorSubject.create(); mMessageSubject.onNext(mMessage)
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 mUpdateSubject=BehaviorSubject.create();
BehaviorSubject mMessageSubject=BehaviorSubject.create();
mMessageSubject.onNext(mMessage)//类型字符串
mMessageSubject.distinctUntilChanged().skip(1).debounce(5,TimeUnit.SECONDS).sample(1,TimeUnit.MINUTES).subscribe(this::onChanged);
BehaviorSubject mTriggerRadiusSubject=BehaviorSubject.create();
mTriggerRadiusSubject.onNext(mTriggerRadius)//双字
mMessageSubject.distinctUntilChanged().skip(1).debounce(5,TimeUnit.SECONDS).sample(1,TimeUnit.MINUTES).subscribe(this::onChanged);
BehaviorSubject observableLocation=BehaviorSubject.create();
observableLocation.onNext(mLocation)//类型位置
observableLocation.distinctUntilChanged().skip(1).debounce(5,TimeUnit.SECONDS).sample(1,TimeUnit.MINUTES).subscribe(this::onChanged);
/*许多其他变量也是如此*/
你可以看到有很多重复。
所以我希望看到的最好是这样:
{
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);
}
}
{
BehaviorSubject mUpdateSubject=BehaviorSubject.create();
Map subjectMap=newtreemap();
subjectMap.put(mMessage,BehaviorSubject.create());
subjectMap.put(mTriggerRadius,BehaviorSubject.create());
subjectMap.put(mLocation,BehaviorSubject.create());
subjectMap.put(mPreconditions,BehaviorSubject.create());
subjectMap.put(mllanguage,BehaviorSubject.create());
对于(Map.Entry:subjectMap.entrySet()){
entry.getValue().onNext(entry.getKey());
消息主体
.distinctUntilChanged()
.skip(1)
.去盎司(5,时间单位秒)
.订阅(此::onChange);
}
}
我不明白为什么这不起作用。我也试过
Map因为我真的不需要主题在一个集合中,所以我通过创建一个方法来解决这个问题,该方法处理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);
}
public void initSubjects(){
mUpdateSubject=BehaviorSubject.create();
initSingleSubject(mMessage,mMessageSubject=BehaviorSubject.create());
initSingleSubject(mTriggerRadius,mTriggerRadiusSubject=BehaviorSubject.create());
initSingleSubject(mlLanguage,mlLanguageSubject=BehaviorSubject.create());
initSingleSubject(mPreconditions,mPreconditionsSubject=BehaviorSubject.create());
initSingleSubject(mLocation,mLocationSubject=BehaviorSubject.create());
}
private void initSingleSubject(对象值、行为主体){
subject.onNext(值);
mUpdateSubject
.distinctUntilChanged()
.skip(1)
.去盎司(5,时间单位秒)
.订阅(此::更新);
}