2012-02-15 37 views
8

Tôi biết đã có khá nhiều câu hỏi về điều này, tuy nhiên, tôi vẫn đang đấu tranh để hiểu được vai trò của lớp học Activity khi thực hiện mẫu thiết kế Model-View-Controller truyền thống trên Android? Cảm giác ruột của tôi là nó phải là Bộ điều khiển, tuy nhiên đó có nghĩa là mối quan hệ một-một giữa các màn hình giao diện người dùng (vì bạn phải có một Activity trên mỗi màn hình) và bộ điều khiển, đánh bại điểm liên kết lỏng lẻo của MVC giữa các thành phần khác nhau.Vai trò của lớp Hoạt động trong MVC là gì?

+0

[Hy vọng bạn sẽ thấy điều này rồi:)] (http://stackoverflow.com/q/2925054/593709) –

+0

Có tôi có :) Dường như chỉ có một nhận xét về câu trả lời có liên quan mặc dù: http://stackoverflow.com/a/2925368/824903 và về cơ bản nói "Android không làm MVC". Tôi đã hy vọng rõ ràng hơn về vấn đề này. – donturner

Trả lời

7

Bạn nói đúng. Giao diện xml có thể được định nghĩa là Xem và lớp khác của bạn làm việc với dữ liệu là Mẫu.

Hoạt động nhận tất cả các sự kiện và mục nhập của người dùng từ Chế độ xem, vì vậy, chúng tôi có thể dễ dàng nói rằng đó là Bộ điều khiển.

Nhưng hãy làm rõ, đó không phải là hoàn hảo (nó thực sự tồn tại?) MVC

Có một cái nhìn để this question, và đặc biệt hơn, những nhận xét đầu tiên của câu trả lời được chấp nhận, nó có thể hữu ích

+0

Vì vậy, về cơ bản Android không làm MVC "ra khỏi hộp"? – donturner

+0

Trong một tay, sdk android cho phép bạn tách các lớp khác nhau của ứng dụng. nhưng mặt khác, bạn có thể xây dựng chế độ xem trực tiếp với mã trong hoạt động. Vì vậy, YES Android có thể cho phép bạn thực hiện MVC, nhưng KHÔNG, nó không phải là một ứng dụng nghiêm ngặt của mẫu. Tôi không phải là một chuyên gia thiết kế mẫu nên có thể ai đó có thể làm rõ điều đó tốt hơn tôi :) – grunk

1

Các hoạt động có thể làm cho các bộ điều khiển có thẩm quyền và, với các mảnh, bạn cũng có thể triển khai thực hiện phân cấp MVC. Hầu hết việc thực hiện MVC là tùy thuộc vào lập trình viên, bởi vì ngay cả trong các khuôn khổ nghiêm ngặt, bạn vẫn có thể tìm cách để do crazy things.

-1

Android không có kiến ​​trúc tốt và không tuân theo mẫu thiết kế MVC. Cách tốt nhất để khái niệm hóa hoạt động trong MVC là dạng xem (với một số logic điều khiển) vì nó bị phá hủy mỗi khi thay đổi cấu hình xảy ra, chẳng hạn như xoay màn hình hoặc thay đổi ngôn ngữ, mất tất cả trạng thái của nó.

Bộ điều khiển trong trường hợp này sẽ là đối tượng Ứng dụng, vì đó là cầu nối của bạn để truy cập chế độ xem (Hoạt động và các thành phần GUI) từ mã bên ngoài ngữ cảnh Hoạt động. Bạn phải sử dụng các singletons để chỉ có một đối tượng Application tại một thời điểm nhất định, nếu không sẽ có một đối tượng Application cho mỗi tiến trình. Đối tượng ứng dụng không phải là nơi tốt để lưu trữ Mô hình vì vòng đời của nó được tách ra khỏi Hoạt động. Nó có thể bị phá hủy và tái tạo tại bất kỳ điểm nào của vòng đời của Activity (trong khi ứng dụng đang ở chế độ nền) mà không làm cho nó khởi động lại, và sau đó tất cả các biến và tham chiếu của nó không được gán bên trong phương thức onCreate() của nó sẽ trở thành null.

Mô hình do đó phải được lưu trữ trên một mảnh không có GUI, không có headless với setRetainInstance (true), được liên kết với một hoạt động và phải được đính kèm lại mỗi khi hoạt động được tạo lại. Bạn phải sử dụng một trình quản lý phân đoạn để đảm bảo rằng bạn đang khôi phục phân đoạn được giữ lại và không tạo ra nó một lần nữa. Đây cũng là nơi tốt nhất để chạy các tác vụ nền, mặc dù bạn cũng có thể chạy chúng trong đối tượng Application. Không bao giờ chạy các tác vụ trên một Hoạt động vì chúng sẽ bị hủy khi thay đổi cấu hình.

0

Tôi nghĩ sự nhầm lẫn có thể xảy ra với việc xác định chế độ xem dưới dạng XML và do đó Hoạt động bị nhầm lẫn là chế độ xem. Nó không phải. Bạn chuyển giao khung nhìn (bố cục XML của bạn) vào Activity, sau đó sẽ thổi phồng các khung nhìn chứa trong layout XML. Hoạt động của bạn cũng chuyển dữ liệu (các mô hình) vào các khung nhìn của bạn (EditText, TextView, phiên bản mở rộng của các khung nhìn cơ bản, vv).

Nếu bạn thực sự muốn MVC thì bạn có thể đạt được điều này đơn giản bằng cách thiết lập chế độ xem của bạn trong bố cục XML, tạo đối tượng xem mở rộng từ chế độ xem gốc của bạn (nếu đó là RelativeLayout mở rộng từ đó). Từ đó bạn thêm các phương thức truy cập của bạn và logic khác nhau cần thiết cho chế độ xem đó và sau đó bạn có thể thêm kiểm tra đơn vị xung quanh đó.

Trong Hoạt động bạn sẽ không còn vượt qua trong ID của bố trí và thay vào đó sẽ làm một cái gì đó như thế này:

CustomView customView = new CustomView(...); 
setContentView(customView); 
... 

Tất nhiên hầu hết các ứng dụng sẽ không làm điều này và bạn thực sự không cần để làm điều này. Gọi findViewById là đủ để liên kết với đối tượng xem đó và gọi phương thức nó có. Mà trong tâm trí của tôi, là MVC.

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