2016-03-27 10 views
0

私はRXJavaでとても新しいです。 私は、初期化でほとんど同じことをする必要がある複数の科目を定義していますが、その一般的な種類は異なります。 現在、私の解決策は、次のようになります。RxAndroidがオブジェクトのコンテンツを購読しています

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*/ 

あなたは繰り返しが多いことがわかります。 は、だから私は、好ましくは、このようになりますatchieveしたいと考えています何:これが動作しない理由を私は理解していない

{ 
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<>(); 提案? ありがとう

答えて

0

私は本当にコレクションの対象を必要としなかったので、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); 
} 
関連する問題