2016-10-27 41 views
5

我想在Android應用程序中使用MVP體系結構實現屏幕,並在視圖端使用RxJava和RxBinding。RxJava和MVP在Android應用程序

基本上我有2個Spinners,1個TextEdit和一個默認禁用的按鈕。我想在Spinners選擇項目並且文本字段不爲空時啓用該按鈕。這裏是代碼:

Observable.combineLatest(
     RxAdapterView.itemSelections(mFirstSpinner), 
     RxAdapterView.itemSelections(mSecondSpinner), 
     RxTextView.textChanges(mEditText), 
     new Func3<Integer, Integer, CharSequence, Boolean>() { 
      @Override 
      public Boolean call(Integer first, Integer second, CharSequence value) { 
       return !TextUtils.isEmpty(value); 
      } 
     }).subscribe(new Action1<Boolean>() { 
     @Override 
     public void call(Boolean enable) { 
      mButton.setEnabled(enable); 
     } 
    }); 

現在的問題是如何將其整合到MVP模式。理想情況下,啓用按鈕的「業務邏輯」應該在演示者中。達到此目的的最佳方式是什麼?我想將原始觀察者以某種方式傳遞給主持人(旁邊的問題是怎麼樣的),並且主持人會將這些觀察者結合起來,並且它將具有啓用按鈕的邏輯。最後,它會調用View來修改按鈕狀態。

有沒有更好的選擇?在視圖方面有RxJava MVP的好例子嗎?

回答

5

我的命題:

你是在正確的軌道上。但RxBinding邏輯應該仍然在視圖中。我會移動連接的邏輯,決定是否啓用按鈕或不進入演示者。

定義的所有領域的藏品價值,你想檢查:

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

在一個視圖中創建一個Observable

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

然後通過這個Observable到主持人:

mPresenter.observeChoosableFieldChanges(observable). 

內部演示者做其餘的:

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

這與我提出並實施的方法非常相似。唯一的區別是,我將3個獨立的觀察者傳遞給演示者,而不是將其組合在視圖上。結合其中的3種也是一種「商業」邏輯。將來我們可能只想使用2個字段,或者添加更多。 –

0

你可以列舉你的源代碼,並通過對價值活動的主題/處理器,在那裏你可以做的邏輯是否要啓用該按鈕和後布爾事件。更新演示者按鈕的人將訂閱該主題/處理器。

像這樣,您可以靈活地更改來源和邏輯,而無需更改演示者視圖合同。

本質上可以有2個絕對解耦部件在演示:

1)成分,它會監聽傳入的視圖事件併產生動作的一個流,以啓用或禁用按鈕 2),它會監聽一個組件啓用/禁用動作並分別更新視圖(您也可以使用Google的綁定庫實現此功能)

通過這種方式,您可以啓用多個交互的解耦鏈,並且易於維護,因爲組件流暢連接的組件瑣碎和清晰。

您還可以使用像RHub library這樣的水印。您可以找到組件示例here

相關問題