2016-10-27 43 views
5

Tôi đang cố gắng triển khai màn hình trong ứng dụng Android sử dụng kiến ​​trúc MVP và sử dụng RxJava và RxBinding ở phía Chế độ xem.RxJava và MVP trong ứng dụng Android

Về cơ bản tôi có 2 Spinners, 1 TextEdit và nút bị tắt theo mặc định. Tôi muốn kích hoạt nút khi Spinners có các mục được chọn và trường văn bản không trống. Đây là mã:

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

Câu hỏi bây giờ là cách tích hợp vào mẫu MVP. Lý tưởng nhất là "logic nghiệp vụ" cho phép nút phải ở trong người trình bày. Cách tốt nhất để đạt được điều này là gì? Tôi đang nghĩ đến việc đưa những người quan sát ban đầu vào người trình bày bằng cách nào đó (câu hỏi phụ là như thế nào?), Và người trình bày sẽ kết hợp những người quan sát đó và nó sẽ có logic cho phép nút. Cuối cùng, nó sẽ chỉ gọi View để sửa đổi trạng thái nút.

Có tùy chọn nào tốt hơn không? Có bất kỳ ví dụ tốt của MVP với RxJava trên View?

Trả lời

5

Đề xuất của tôi:

Bạn đang đi đúng hướng. Tuy nhiên, logic RxBinding vẫn phải ở chế độ xem. Tôi sẽ di chuyển logic được kết nối với việc quyết định có bật nút hay không vào trình bày.

Xác định một giá trị giữ mô hình từ tất cả các lĩnh vực mà bạn muốn kiểm tra:

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

Bên trong một cái nhìn tạo ra một 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); 
      } 
     } 
) 

Sau đó vượt qua Observable này để dẫn chương trình:

mPresenter.observeChoosableFieldChanges(observable). 

Người trình bày bên trong làm phần còn lại:

+0

Điều này rất giống với cách tiếp cận mà tôi đã đề xuất và triển khai. Sự khác biệt duy nhất là tôi vượt qua 3 người quan sát riêng biệt để trình bày thay vì kết hợp chúng ở phía bên xem.Kết hợp 3 trong số đó cũng là loại logic "kinh doanh". Trong tương lai, chúng tôi có thể chỉ muốn sử dụng 2 trường hoặc thêm một số trường nữa. –

0

bạn có thể liệt kê các nguồn của mình và chuyển các sự kiện giá trị cặp tới Chủ thể/Bộ xử lý nơi bạn có thể thực hiện lôgic cho dù có bật nút và đăng sự kiện boolean hay không. Người cập nhật nút từ người trình bày sẽ đăng ký Chủ đề/Người xử lý này.

Như thế này, bạn có thể linh hoạt thay đổi nguồn và logic mà không thay đổi hợp đồng Người xem-Chế độ xem.

Về cơ bản bạn có thể có 2 thành phần hoàn toàn tách rời trong Presenter:

1) thành phần mà lắng nghe các sự kiện tầm nhìn đến và tạo ra một dòng hành động để kích hoạt hoặc vô hiệu hóa các nút 2) một thành phần mà nghe cho phép/vô hiệu hóa các hành động và cập nhật khung nhìn tương ứng (điều này bạn cũng có thể đạt được với Thư viện ràng buộc của Google)

Bằng cách này bạn có thể kích hoạt nhiều chuỗi tương tác đã tách riêng và dễ duy trì các thành phần do tầm thường và độ rõ ràng của các kết nối luồng.

Bạn cũng có thể sử dụng smth như RHub library. Bạn có thể tìm thấy các thành phần ví dụ here

Các vấn đề liên quan