2016-07-13 15 views
10

Trong mẫu MVP có trách nhiệm xử lý các nhấp chuột trên giao diện người dùng?
Ví dụ: cách tiếp cận phi MVP sẽ là một cái gì đó như:Trong MVP là onClick trách nhiệm của View hoặc Presenter?

counterButton.setOnClickListener(new View.OnClickListener() { 
    public void onClick(View v) { 
     totalClicks++; 
     counterTextView.setText("Total clicks so far: "+totalClicks); 
    } 
    }); 

Sử dụng MVP là onClick trách nhiệm của Presenter? Hoặc View có thể xử lý điều đó?
Ai đó có thể làm rõ điều này không?

Trả lời

17

OnClick nên gọi phương thức Presenter. Bạn nên làm kinh doanh của bạn trong presenter và nếu bạn cần phải cập nhật các ui bạn nên xác định một phương pháp trong View của bạn và gọi nó từ người trình bày.

Bạn cần một phương pháp để View của bạn ví dụ:

public void showCounterCount(final int totalClicks){ 
    counterTextView.setText("Total clicks so far: "+totalClicks); 
} 

Ngoài ra bạn cần một phương pháp và một biến trong Presenter của bạn:

int totalClicks = 0; 

public void onCounterButtonClicked(){ 
    totalClicks++; 
    mView.showCounterCount(totalClicks); 
} 

Và refactor code của bạn như thế này:

counterButton.setOnClickListener(new View.OnClickListener() { 
    public void onClick(View v) { 
     mPresenter.onCounterButtonClicked(); 
    } 
    }); 

Để có kiến ​​trúc phức tạp và sạch hơn, bạn có thể thực hiện trường hợp sử dụng của mình kinh doanh trong tương tác. (Trong ví dụ của bạn tăng giá trị bộ đếm là trường hợp sử dụng cho ứng dụng của bạn)

Bạn có thể xác định một người tương tác và tăng giá trị bộ đếm của bạn ở đó.

CounterInteractor:

public CounterInteractor{ 
    public int incrementCounter(int currentCounter){ 
     return currentCounter+1; 
    } 
} 

Và Refactor người dẫn chương trình của bạn như dưới đây:

int totalClicks = 0; 
CounterInteractor mCounterInteractor = new CounterInteractor(); 

public void onCounterButtonClicked(){ 
    totalClicks = mCounterInteractor.incrementCounter(totalClicks); 
    mView.showCounterCount(totalClicks); 
} 

Với phương pháp này bạn tách logic kinh doanh của bạn hoàn toàn từ các diễn giả và tái sử dụng các khái niệm sử dụng hợp cụ thể của bạn mà không cần sao chép mã trong diễn giả. Đây là cách tiếp cận sạch sẽ hơn.

Bạn cũng có thể kiểm tra git repo này cho các phương pháp tiếp cận MVP khác nhau. https://github.com/googlesamples/android-architecture/tree/todo-mvp-clean/

Chúc may mắn.

Edit:

Dưới đây là trọng lượng nhẹ nguồn dự án của khách hàng wikipedia tôi: https://github.com/savepopulation/wikilight

Tôi đang cố gắng để thực hiện MVP. (MVP + Dagger2 + RxJava)

+1

Thành thật mà nói, nếu đó là cách tiếp cận MVP, tôi không thực sự thấy nó như là một cải tiến so với đoạn mã gốc. Chúng tôi chỉ thêm 1 trừu tượng/chuyển hướng nhưng lợi ích ở đâu? – Jim

+1

chúng tôi chia ứng dụng thành ba lớp và tách logic nghiệp vụ khỏi ui. các hoạt động và các mảnh là các khung nhìn và chỉ chịu trách nhiệm cập nhật ui và chỉ chứa các phương thức giao diện được gọi bởi người trình bày. ví dụ của bạn rất đơn giản nên khó có thể thấy được lợi ích nhưng trong các ứng dụng lớn, bạn có thể thấy rõ hơn. nó cũng hữu ích cho việc kiểm tra ui. bạn có thể kiểm tra liên kết này. http://antonioleiva.com/mvp-android/ – savepopulation

+4

Lợi ích chính là thử nghiệm.Trong ví dụ trên, bạn có thể viết một bài kiểm tra đơn vị cho phương thức 'onCounterButtonClicked()' trong Trình bày mà không có bất kỳ sự phụ thuộc nào vào khung công tác Android. Các thử nghiệm như vậy có thể chạy trên JVM. Ngoài ra, tôi tránh các từ như 'button' và' click' trong tên phương thức Presenter để liên kết chúng chặt chẽ với các khái niệm của lớp View – Jahnold

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