Có thể triển khai mô hình trình điều khiển của chế độ xem mô hình của Google trong Java cho Android không?
Hoặc nó đã được thực hiện thông qua các hoạt động? Hoặc có cách nào tốt hơn để triển khai mẫu MVC cho Android không?
Có thể triển khai mô hình trình điều khiển của chế độ xem mô hình của Google trong Java cho Android không?
Hoặc nó đã được thực hiện thông qua các hoạt động? Hoặc có cách nào tốt hơn để triển khai mẫu MVC cho Android không?
Câu trả lời:
Trong Android, bạn không có MVC, nhưng bạn có những điều sau đây:
Không có mẫu MVC duy nhất trên toàn cầu. MVC là một khái niệm chứ không phải là một khung lập trình vững chắc. Bạn có thể thực hiện MVC của riêng bạn trên bất kỳ nền tảng nào. Miễn là bạn tuân theo ý tưởng cơ bản sau, bạn đang triển khai MVC:
Cũng nghĩ về nó theo cách này: Khi bạn lập trình mô hình của mình, mô hình không cần phải lo lắng về kết xuất (hoặc mã cụ thể của nền tảng). Mô hình sẽ nói với quan điểm, tôi không quan tâm nếu kết xuất của bạn là Android hoặc iOS hoặc Windows Phone, đây là những gì tôi cần bạn kết xuất. Khung nhìn sẽ chỉ xử lý mã kết xuất dành riêng cho nền tảng.
Điều này đặc biệt hữu ích khi bạn sử dụng Mono để chia sẻ mô hình nhằm phát triển các ứng dụng đa nền tảng.
Các hành động, chế độ xem và hoạt động trên Android là cách thức hoạt động với giao diện người dùng Android và là một triển khai của mô hình mô hình xem viewmodel (MVVM) , có cấu trúc tương tự (trong cùng một gia đình) Bộ điều khiển.
Theo hiểu biết tốt nhất của tôi, không có cách nào để thoát ra khỏi mô hình này. Nó có thể được thực hiện, nhưng bạn có thể sẽ mất tất cả lợi ích mà mô hình hiện có có và phải viết lại lớp UI của riêng bạn để làm cho nó hoạt động.
Sau một số tìm kiếm, câu trả lời hợp lý nhất là như sau:
MVC đã được triển khai trong Android dưới dạng:
Button
xuất phát từ android.view.View
.(Điều này bằng cách này ngụ ý không có logic miền ứng dụng trong hoạt động.)
Điều hợp lý nhất cho một nhà phát triển nhỏ là tuân theo mô hình này và không cố gắng làm những gì Google quyết định không làm.
PS Lưu ý rằng Hoạt động đôi khi được khởi động lại, vì vậy không có chỗ cho dữ liệu mô hình (cách dễ nhất để gây khởi động lại là bỏ qua android:configChanges="keyboardHidden|orientation"
XML và biến thiết bị của bạn).
BIÊN TẬP
Có thể chúng ta đang nói về MVC , nhưng sẽ nói như vậy là FMVC , Framework - Model - View - Controller . Các khung (hệ điều hành Android) áp đặt ý tưởng của chu kỳ tuổi thọ linh kiện và các sự kiện liên quan, và trong thực tế các điều khiển ( Activity
/ Service
/ BroadcastReceiver
) là trước hết là trách nhiệm đối phó với những khung -imposed sự kiện (chẳng hạn như onCreate () ). Đầu vào của người dùng nên được xử lý riêng? Ngay cả nếu cần, bạn không thể tách nó ra, các sự kiện đầu vào của người dùng cũng đến từ Android.
Dù sao, càng ít mã không dành riêng cho Android mà bạn đặt vào Activity
/ Service
/ BroadcastReceiver
thì càng tốt.
Button
biết về Bộ điều khiển ? Có vẻ hợp lý hơn khi Lượt xem chỉ biết về việc hiển thị mọi thứ. Và có tính đến việc Model chỉ biết về bản chất của dữ liệu, đây là lý do cần Bộ điều khiển : cần phải biết cả về Mô hình và Chế độ xem .
Service
nó cũng nằm dưới chiếc ô điều khiển
Không có mẫu MVC nào bạn có thể tuân theo. MVC chỉ nêu rõ ít nhiều rằng bạn không nên trộn lẫn dữ liệu và chế độ xem, do đó, ví dụ: các khung nhìn chịu trách nhiệm giữ dữ liệu hoặc các lớp đang xử lý dữ liệu đang ảnh hưởng trực tiếp đến chế độ xem.
Nhưng tuy nhiên, cách Android xử lý các lớp và tài nguyên, đôi khi bạn thậm chí buộc phải tuân theo mô hình MVC. Theo tôi, phức tạp hơn là các hoạt động đôi khi chịu trách nhiệm về quan điểm, nhưng vẫn hoạt động như một bộ điều khiển cùng một lúc.
Nếu bạn xác định các chế độ xem và bố cục của mình trong các tệp XML, hãy tải tài nguyên của bạn từ thư mục res và nếu bạn tránh ít nhiều để trộn lẫn những thứ này trong mã của mình, thì dù sao bạn cũng đang theo mô hình MVC.
Bạn có thể triển khai MVC trong Android, nhưng nó không được "hỗ trợ nguyên bản" và mất một số nỗ lực.
Điều đó nói rằng, cá nhân tôi có xu hướng hướng tới MVP như một mô hình kiến trúc sạch hơn nhiều để phát triển Android. Và bằng cách nói MVP tôi có ý này:
Tôi cũng đã đăng một câu trả lời chi tiết hơn ở đây .
Sau khi chơi với các cách tiếp cận khác nhau để triển khai MVC / MVP trong Android, tôi đã tìm ra một mẫu kiến trúc hợp lý, mà tôi đã mô tả trong bài đăng này: MVP và MVC Architectural Forms trong Android .
Tài nguyên tốt nhất tôi tìm thấy để triển khai MVC trên Android là bài đăng này :
Tôi đã làm theo thiết kế tương tự cho một trong những dự án của tôi và nó hoạt động rất tốt. Tôi là người mới bắt đầu trên Android, vì vậy tôi không thể nói rằng đây là giải pháp tốt nhất.
Tôi đã thực hiện một sửa đổi: Tôi đã khởi tạo mô hình và bộ điều khiển cho từng hoạt động trong lớp ứng dụng để chúng không được tạo lại khi chế độ chân dung ngang thay đổi.
Tôi đồng ý với JDPeckham và tôi tin rằng chỉ riêng XML là không đủ để triển khai phần UI của ứng dụng.
Tuy nhiên, nếu bạn coi Activity là một phần của khung nhìn thì việc triển khai MVC khá đơn giản. Bạn có thể ghi đè Ứng dụng (như được trả về bởi getApplication () trong Hoạt động) và ở đây bạn có thể tạo một bộ điều khiển tồn tại trong suốt vòng đời của ứng dụng.
(Ngoài ra, bạn có thể sử dụng mẫu singleton theo đề xuất của tài liệu Ứng dụng)
MVC- Architecture trên Android Tốt hơn để theo dõi bất kỳ MVP nào thay vì MVC trong Android. Nhưng vẫn theo câu trả lời cho câu hỏi này có thể là giải pháp
Mô tả và Hướng dẫn
Controller -
Activity can play the role.
Use an application class to write the
global methods and define, and avoid
static variables in the controller label
Model -
Entity like - user, Product, and Customer class.
View -
XML layout files.
ViewModel -
Class with like CartItem and owner
models with multiple class properties
Service -
DataService- All the tables which have logic
to get the data to bind the models - UserTable,
CustomerTable
NetworkService - Service logic binds the
logic with network call - Login Service
Helpers -
StringHelper, ValidationHelper static
methods for helping format and validation code.
SharedView - fragmets or shared views from the code
can be separated here
AppConstant -
Use the Values folder XML files
for constant app level
CHÚ THÍCH 1:
Bây giờ đây là mảnh ma thuật bạn có thể làm. Khi bạn đã phân loại đoạn mã, hãy viết một lớp giao diện cơ sở như, IEntity và IService. Khai báo các phương thức phổ biến. Bây giờ hãy tạo lớp trừu tượng BaseService và khai báo tập phương thức của riêng bạn và tách mã.
CHÚ THÍCH 2: Nếu hoạt động của bạn đang trình bày nhiều mô hình thì thay vì viết mã / logic trong hoạt động, tốt hơn là chia các khung nhìn thành các đoạn. Vậy thì tốt hơn. Vì vậy, trong tương lai nếu cần thêm mô hình nào để hiển thị trong chế độ xem, hãy thêm một đoạn nữa.
CHÚ THÍCH 3: Tách mã là rất quan trọng. Mỗi thành phần trong kiến trúc nên độc lập không có logic phụ thuộc. Nếu tình cờ nếu bạn có một cái gì đó phụ thuộc logic, thì hãy viết một lớp logic ánh xạ ở giữa. Điều này sẽ giúp bạn trong tương lai.
Tạo giao diện người dùng Android bằng cách sử dụng bố cục, tài nguyên, hoạt động và ý định là một triển khai của mẫu MVC. Vui lòng xem liên kết sau để biết thêm về điều này - http://www.cs.otago.ac.nz/cosc346/labs/COSC346-lab2.2up.pdf
Mẫu MVC của Android được (loại) được triển khai với các lớp Adaptor của họ . Họ thay thế một bộ điều khiển bằng một "bộ chuyển đổi." Mô tả cho các trạng thái bộ chuyển đổi:
Một đối tượng Adaptor đóng vai trò là cầu nối giữa Adaptor và dữ liệu cơ bản cho chế độ xem đó.
Tôi chỉ xem xét ứng dụng Android này đọc từ cơ sở dữ liệu, vì vậy tôi không biết nó hoạt động tốt như thế nào. Tuy nhiên, có vẻ như kiến trúc Model-View-Delegate của Qt, mà họ tuyên bố là một bước tiến từ một mô hình MVC truyền thống. Ít nhất là trên PC, mẫu của Qt hoạt động khá tốt.
Mặc dù bài đăng này có vẻ đã cũ nhưng tôi muốn thêm hai phần sau để thông báo về sự phát triển gần đây trong lĩnh vực này cho Android:
ràng buộc android - Cung cấp một khung công tác cho phép liên kết các widget của chế độ xem Android với mô hình dữ liệu. Nó giúp triển khai các mẫu MVC hoặc MVVM trong các ứng dụng Android.
roboguice - RoboGuice đưa sự phỏng đoán ra khỏi sự phát triển. Tiêm View, Tài nguyên, Dịch vụ hệ thống hoặc bất kỳ đối tượng nào khác và để RoboGuice chăm sóc các chi tiết.
Sự miêu tả:
Mẫu MVC về cơ bản là thế này:
Tính năng quan trọng của MVC: Chúng tôi có thể sửa đổi Mô hình hoặc Chế độ xem hoặc Trình điều khiển vẫn không ảnh hưởng đến các mô hình khác
Tôi nghĩ rằng lời giải thích đơn giản hữu ích nhất là ở đây: http://www.cs.otago.ac.nz/cosc346/labs/COSC346-lab2.2up.pdf
Từ mọi thứ khác tôi đã thấy và đọc ở đây, việc thực hiện tất cả những điều này làm cho nó khó hơn và không phù hợp với các phần khác của Android.
Có một hoạt động triển khai các trình nghe khác đã là cách tiêu chuẩn của Android. Cách vô hại nhất là thêm Trình quan sát Java như các trang trình bày mô tả và nhóm onClick và các loại hành động khác vào các hàm vẫn còn trong Hoạt động.
Cách Android là Activity hoạt động cả hai. Chiến đấu với nó không thực sự làm cho việc mở rộng hoặc thực hiện mã hóa trong tương lai dễ dàng hơn.
Tôi đồng ý với bài thứ 2 . Đó là loại đã được thực hiện, không phải là cách mọi người đã quen. Cho dù nó có trong cùng một tệp hay không, đã có sự phân tách. Không cần phải tạo thêm sự tách biệt để làm cho nó phù hợp với các ngôn ngữ và hệ điều hành khác.
Thật đáng ngạc nhiên khi thấy rằng không có bài viết nào ở đây trả lời câu hỏi. Chúng quá chung chung, mơ hồ, không chính xác hoặc không đề cập đến việc triển khai trong Android.
Trong MVC, lớp View chỉ biết cách hiển thị giao diện người dùng (UI). Nếu bất kỳ dữ liệu nào là cần thiết cho việc này, nó sẽ lấy nó từ lớp Model . Nhưng Chế độ xem KHÔNG trực tiếp yêu cầu mô hình tìm dữ liệu, nó thực hiện thông qua Bộ điều khiển . Vì vậy, Bộ điều khiển gọi Mô hình để cung cấp dữ liệu cần thiết cho Chế độ xem . Khi dữ liệu đã sẵn sàng, Bộ điều khiển thông báo cho Chế độ xem rằng dữ liệu đã sẵn sàng để được lấy từ Mô hình . Bây giờ, View có thể lấy dữ liệu từ Model .
Luồng này có thể được tóm tắt như sau:
Điều đáng chú ý là Chế độ xem có thể biết về tính khả dụng của dữ liệu trong Mô hình thông qua Bộ điều khiển - còn được gọi là thụ động MVC - hoặc bằng cách quan sát dữ liệu trong Mô hình bằng cách đăng ký có thể quan sát được với nó, đó là Active MVC .
Về phần triển khai, một trong những điều đầu tiên xuất hiện là thành phần Android nào nên được sử dụng cho Chế độ xem ? Activity
hay Fragment
?
Câu trả lời là nó không quan trọng và cả hai đều có thể được sử dụng. Các Xem sẽ có thể trình bày các giao diện người dùng (UI) trên thiết bị và đáp ứng với sự tương tác của người dùng với giao diện người dùng. Cả Activity
vàFragment
cung cấp các phương pháp cần thiết cho việc này.
Trong ứng dụng ví dụ được sử dụng trong bài viết này, tôi đã sử dụng Activity
cho lớp View , nhưng Fragment
cũng có thể được sử dụng.
Ứng dụng mẫu hoàn chỉnh có thể được tìm thấy trong nhánh 'mvc' của repo GitHub của tôi ở đây .
Tôi cũng đã giải quyết những ưu và nhược điểm của kiến trúc MVC trong Android thông qua một ví dụ ở đây .
Đối với những người quan tâm, tôi đã bắt đầu một loạt bài viết về kiến trúc ứng dụng Android ở đây, trong đó tôi so sánh các kiến trúc khác nhau, ví dụ như MVC, MVP, MVVM, để phát triển ứng dụng Android thông qua một ứng dụng hoàn chỉnh.
Mệt mỏi vì thảm họa MVx trên Android Gần đây tôi đã tạo một thư viện nhỏ cung cấp luồng dữ liệu đơn hướng và tương tự như khái niệm về MVC: https://github.com/zserge/anvil
Về cơ bản, bạn có một thành phần (hoạt động, đoạn và nhóm xem). Bên trong bạn xác định cấu trúc và phong cách của lớp xem. Ngoài ra, bạn xác định cách dữ liệu nên được ràng buộc với các khung nhìn. Cuối cùng, bạn có thể ràng buộc người nghe ở cùng một nơi.
Sau đó, khi dữ liệu của bạn được thay đổi - phương thức "render ()" toàn cầu sẽ được gọi và chế độ xem của bạn sẽ được cập nhật thông minh với dữ liệu gần đây nhất.
Đây là một ví dụ về thành phần có mọi thứ bên trong để thu gọn mã (tất nhiên Model và Trình điều khiển có thể dễ dàng tách rời). Ở đây "Count" là một mô hình, phương thức view () là một khung nhìn và "v -> Count ++" là một bộ điều khiển lắng nghe các nút bấm và cập nhật mô hình.
public MyView extends RenderableView {
public MyView(Context c) {
super(c);
}
private int count = 0;
public void view() {
frameLayout(() -> { // Define your view hierarchy
size(FILL, WRAP);
button(() -> {
textColor(Color.RED); // Define view style
text("Clicked " + count); // Bind data
onClick(v -> count++); // Bind listeners
});
});
}
Với mô hình và bộ điều khiển riêng biệt, nó sẽ trông như sau:
button(() -> {
textColor(Color.RED);
text("Clicked " + mModel.getClickCount());
onClick(mController::onButtonClicked);
});
Ở đây trên mỗi nút bấm, số sẽ được tăng lên, sau đó "render ()" sẽ được gọi và văn bản nút sẽ được cập nhật.
Cú pháp trở nên dễ chịu hơn nếu bạn sử dụng Kotlin: http://zserge.com/blog/anvil-kotlin.html . Ngoài ra, có cú pháp thay thế cho Java mà không có lambdas.
Bản thân thư viện rất nhẹ, không phụ thuộc, không sử dụng phản xạ, v.v.
(Tuyên bố miễn trừ trách nhiệm: Tôi là tác giả của thư viện này)
Theo lời giải thích mà nhóm Xamarin đã giải thích (trên iOS MVC "Tôi biết điều đó có vẻ kỳ lạ, nhưng đợi một chút"):
Tôi có thể nói điều này:
Mô hình trên Android chỉ đơn giản là đối tượng có thể phân phối. Khung nhìn là bố cục XML và bộ điều khiển là (hoạt động + đoạn của nó).
* Đây chỉ là ý kiến của tôi, không phải từ bất kỳ tài nguyên hoặc một cuốn sách.
Không có kiến trúc MVC được triển khai, nhưng tồn tại một tập hợp các thư viện / ví dụ để triển khai kiến trúc MVP (model model view view người trình bày).
Vui lòng kiểm tra các liên kết sau:
Google đã thêm một ví dụ về MVP kiến trúc Android:
Tôi đã thấy rằng nhiều người đang nói rằng MVC đã được triển khai trong Android, nhưng điều đó không đúng. Android không theo MVC theo mặc định.
Bởi vì tôi không bao giờ Google sẽ áp đặt mạnh mẽ các hạn chế của việc triển khai MVC như iPhone, nhưng tùy thuộc vào các nhà phát triển tạo ra hoặc kỹ thuật họ muốn trong dự án của họ, trong các ứng dụng nhỏ hoặc đơn giản, không cần sử dụng MVC, nhưng là ứng dụng phát triển và trở nên phức tạp và yêu cầu sửa đổi mã của nó trong những năm sau đó, sau đó xuất hiện nhu cầu về mô hình MVC trong Android.
Nó cung cấp một cách dễ dàng để sửa đổi mã và cũng giúp giảm các vấn đề. Nếu bạn muốn triển khai MVC trên Android, hãy theo liên kết dưới đây và tận hưởng triển khai MVC trong dự án của bạn.
http://www.therealjoshua.com/2011/11/android-arch architecture-part-1-intro /
Nhưng ngày nay tôi nghĩ MVP cùng với Android Architectural Pattern là một trong những lựa chọn tốt nhất mà các nhà phát triển nên sử dụng cho một ứng dụng Android sạch và mạnh mẽ.
Khi chúng tôi áp dụng MVC, MVVM hoặc Mô hình trình bày cho ứng dụng Android, điều chúng tôi thực sự muốn là có một dự án có cấu trúc rõ ràng và quan trọng hơn là dễ dàng hơn cho các bài kiểm tra đơn vị.
Hiện tại, không có khung của bên thứ ba, bạn thường có rất nhiều mã (như addXXListener (), findViewById (), v.v.), không thêm bất kỳ giá trị doanh nghiệp nào.
Hơn thế nữa, bạn phải chạy thử nghiệm đơn vị Android thay vì thử nghiệm JUnit thông thường, mất nhiều thời gian để chạy và khiến thử nghiệm đơn vị hơi không thực tế. Vì những lý do này, vài năm trước chúng tôi đã bắt đầu một dự án nguồn mở, RoboBinding - Khung mô hình trình bày ràng buộc dữ liệu cho nền tảng Android.
RoboBinding giúp bạn viết mã UI dễ đọc, kiểm tra và bảo trì hơn. RoboBinding loại bỏ sự cần thiết của mã không cần thiết như addXXListener hoặc như vậy , và chuyển logic UI sang Mô hình trình bày, là POJO và có thể được kiểm tra thông qua các bài kiểm tra JUnit thông thường . Bản thân RoboBinding đi kèm với hơn 300 bài kiểm tra JUnit để đảm bảo chất lượng của nó.
Theo hiểu biết của tôi, cách Android xử lý mẫu MVC giống như:
Bạn có một Activity, đóng vai trò là bộ điều khiển. Bạn có một lớp có trách nhiệm lấy dữ liệu - mô hình và sau đó bạn có lớp View là dạng xem.
Khi nói về quan điểm, hầu hết mọi người chỉ nghĩ về phần hình ảnh được xác định trong xml. Chúng ta đừng quên rằng View cũng có một phần chương trình với các hàm tạo, phương thức và vv của nó, được định nghĩa trong lớp java.