Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java RxAndroid订阅对象内容更改_Java_Generics_Wildcard Mapping - Fatal编程技术网

Java RxAndroid订阅对象内容更改

Java RxAndroid订阅对象内容更改,java,generics,wildcard-mapping,Java,Generics,Wildcard Mapping,我对RXJava非常陌生。 我定义了多个主题,它们在初始化时需要做几乎相同的事情,但它们的泛型类型不同。 目前,我的解决方案如下所示: BehaviorSubject<PepPoint> mUpdateSubject = BehaviorSubject.create(); BehaviorSubject<String> mMessageSubject = BehaviorSubject.create(); mMessageSubject.onNext(mMessage)

我对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 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,时间单位秒)
.订阅(此::更新);
}