2016-10-27 38 views
5

MVP mimarisini kullanarak ve Görünüm tarafında RxJava ve RxBinding kullanarak Android uygulamasında bir ekran uygulamaya çalışıyorum.RxJava ve MVP

Temelde 2 Spinner, 1 TextEdit ve varsayılan olarak devre dışı bırakılmış bir düğmem var. Spinners öğelerinin seçilmesi ve metin alanının boş olmaması durumunda düğmeyi etkinleştirmek istiyorum. İşte kod şu şekildedir: Bu, MVP modeline nasıl entegre edileceğidir. İdeal olarak, düğmeyi etkinleştirmenin "iş mantığı" sunumcunun içinde olmalıdır. Bunu başarmanın en iyi yolu nedir? Özgün gözlemcileri bir şekilde sunucuya aktarmayı düşünüyorum (yan soru nasıl?) Ve sunum yapan kişi bu gözlemcileri birleştirecek ve düğmeyi etkinleştirmenin mantığına sahip olacaktı. Sonunda, sadece düğme durumunu değiştirmek için Görüntüle'yi çağırırdı.

Daha iyi seçenekler var mı? Görünüm tarafında RxJava ile iyi bir MVP örneği var mı?

cevap

5

Benim önerim:

Doğru yoldasınız. Ancak RxBinding mantığı hala görünümde olmalıdır. Düğmeyi etkinleştirip etkinleştirmeyeceğine karar vermekle bağlantılı mantığı hareket ettiririm.

tüm alanlardan bir modeli tutan değerini tanımlamak Kontrol etmek istiyorum:

:

Observable observable = Observable.combineLatest(
     RxAdapterView.itemSelections(mFirstSpinner), 
     RxAdapterView.itemSelections(mSecondSpinner), 
     RxTextView.textChanges(mEditText), 
     new Func3<Integer, Integer, CharSequence, ViewValuesModel>() { 
      @Override 
      public ViewValuesModel call(Integer first, Integer second, CharSequence value) { 
       return new ViewValuesModel(first, second, value); 
      } 
     } 
) 

Ardından sunum yapan kişiye bu Observable geçmesi:

private class ViewValuesModel { 
    public Integer adapter1Value; 
    public Integer adapter2Value; 
    public CharSequence textValue; 

    public ViewValuesModel(Integer adapter1Value, Integer adapter2Value, CharSequence textValue) { 
     this.adapter1Value = adapter1Value; 
     this.adapter2Value = adapter2Value; 
     this.textValue = textValue; 
    } 
} 

if bir iç görünüm oluşturmak Observable bir

mPresenter.observeChoosableFieldChanges(observable). 

Sunucunun içinde kalanını yap:

observable 
    .map(new Func1<ViewValuesModel, Boolean>() { 
     @Override 
     public Booleancall(ViewValuesModel viewStates) { 
      return !TextUtils.isEmpty(viewStates.textValue); 
     } 
    }) 
    .subscribe(new Action1<Boolean>() { 
     @Override 
     public void call(Boolean enable) { 
      if (enable) { 
       view.enableButton(); 
      } 
     } 
    }); 
+0

Bu, önerdiğim ve uyguladığım yaklaşıma çok benzer. Tek fark, 3 ayrı gözlemciyi, görüntüleyenler tarafında bir araya getirmek yerine, sunucuya aktarmamdır.Bunların 3'ü bir arada da "iş" mantığıdır. Gelecekte sadece 2 alan kullanmak veya biraz daha eklemek isteyebiliriz. –

0

Kaynağını numaralandırmak ve düğmeye ve post boole etkinlikleri etkinleştirmek için olsun veya olmasın mantığı yapabileceği bir konu/İşlemciye Çifti değeri olayları geçebilir. Sunucuyu butondan güncelleyen adam bu Konu/İşlemciye abone olacaktır.

Bunun gibi Presenter-View sözleşmesini değiştirmeden kaynakları ve mantığı değiştirme esnekliğine sahipsiniz.

Esasen Presenter'da 2 kesinlikle Bağlanmadan bileşene sahip olabilir:

gelen şekilde gelişen dinler ve etkinleştirmek veya renkli 2) dinleyen bir bileşeni devre dışı bırakmak için bir hareket akımı oluşturur

1) bileşen eylemleri etkinleştirin/devre dışı bırakın ve görünümü sırasıyla güncelleyin (bu, Google'ın Kitaplık Kitaplığı ile de elde edebilirsiniz)

Bu şekilde, birden fazla birbiriyle bağlantılı etkileşim zincirini etkinleştirebilir ve bileşenlerin önemsizliğini ve akış bağlantılarının netliğini korumayı kolaylaştırırsınız.

Ayrıca RHub library gibi smth kullanabilirsiniz. Bileşen örneğini bulabilirsiniz here