2016-03-27 18 views
0

RXJava ile çok yeniyim. Başlatmada hemen hemen aynı şeyi yapması gereken birden çok Konu tanımlıyorum, ancak bunların genel türleri farklı. Şu benim çözüm gibi görünür:RxAndroid nesne içeriğine abone oluyor

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

Sen tekrarlama çok şey var görebilirsiniz. Yani tercihen böyle bir şey olmazdı atchieve için umut ne: Bu işe yaramazsa neden anlamıyorum

{ 
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); 
    } 
} 

. Ayrıca Map<? super Object, BehaviorSubject<? super Object>> subjectMap = new TreeMap<>(); Öneriler'i denedim? Teşekkürler

cevap

0

Gerçekten koleksiyonda olmak için konulara ihtiyaç duymadığım için, yalnızca döngünün yaptığı her şeyi aynı şekilde ele alan bir yöntem oluşturarak sorunu çözdüm.

Çözüm:

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); 
}