Какова роль класса Activity в MVC? - PullRequest
11 голосов
/ 15 февраля 2012

Я знаю, что было довольно много вопросов по этому поводу, однако я все еще пытаюсь понять, какую роль должен играть класс Activity при реализации традиционного шаблона проектирования Model-View-Controller на Android?

Мне кажется, что это должен быть Контроллер, но это означает взаимно-однозначное соотношение между экранами пользовательского интерфейса (поскольку у вас должно быть по одному Activity на экран) и контроллерами, что побеждает точкуСлабая связь MVC между различными компонентами.

Ответы [ 4 ]

8 голосов
/ 15 февраля 2012

Вы правы.Интерфейсы xml можно определить как Представление , а другой класс, работающий с данными, как Модель .

. Деятельность получает все события и пользовательские входные данные из представления.Таким образом, мы можем легко сказать, что это Контроллер .

Но давайте поясним, что это не идеальный (он действительно существует?) MVC

Естьпосмотрите на этот вопрос , а точнее, на первый комментарий принятого ответа, это может быть полезно

1 голос
/ 14 марта 2014

Действия могут создавать компетентные контроллеры, а с фрагментами вы также можете реализовать иерархический MVC. Большая часть работы MVC зависит от программиста, потому что даже в самых строгих фреймворках вы все равно можете найти способы совершать безумные поступки .

0 голосов
/ 07 июня 2016

Я думаю, что может возникнуть путаница с определением представления как XML, и поэтому Activity ошибочно принимается за представление.Это не.Вы передаете представление (ваш XML-макет) в Activity, которая затем надувает представления, содержащиеся в XML-макете.Ваша деятельность также передает данные (модели) в ваши представления (EditText, TextView, расширенную версию базовых представлений и т. Д.).

Если вы действительно хотите MVC, то вы можете добиться этого, просто настроив свое представление в XMLмакет, создайте объект представления, который выходит из вашего корневого представления (если это расширение RelativeLayout от этого).Оттуда вы добавляете свои методы доступа и другую логику, необходимую для этого представления, и затем вы можете добавить модульное тестирование вокруг этого.

В Упражнении вы больше не будете передавать идентификатор макета и вместо этого будете делать что-то вродеthis:

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

Конечно, почти все приложения этого не сделают, и вам действительно не нужно этого делать.Вызов findViewById достаточно для ссылки на этот объект представления и вызова его методов.Что, на мой взгляд, является MVC.

0 голосов
/ 01 сентября 2015

Android не имеет хорошей архитектуры и не соответствует шаблону проектирования MVC.

Лучший способ концептуализации Activity в MVC - это представление (с некоторой логикой контроллера), потому что оно разрушается каждый раз, когда происходит изменение конфигурации, например, поворот экрана или изменение локали, теряя все свое состояние.

Контроллером в этом случае будет объект Application, поскольку он является вашим мостом для доступа к представлению (Activity и его компонентам GUI) из кода вне контекста Activity. Вы должны использовать синглтоны, чтобы в каждый момент времени существовал только один объект Application, в противном случае в каждом процессе будет один объект Application. Объект Application не подходит для хранения Модели, поскольку ее жизненный цикл отделен от жизненного цикла. Он может быть уничтожен и воссоздан в любой точке жизненного цикла Действия (пока приложение находится в фоновом режиме), не вызывая его перезапуск, и тогда все его переменные и ссылки, не назначенные в его методе onCreate (), станут нулевыми.

Следовательно, модель должна храниться в фрагменте без заголовка без графического интерфейса пользователя с setRetainInstance (true), который связан с действием и должен повторно присоединяться к нему каждый раз при повторном создании действия. Вы должны использовать менеджер фрагментов, чтобы убедиться, что вы восстанавливаете сохраненный фрагмент и не создаете его заново. Это также лучшее место для запуска фоновых задач, хотя вы также можете запускать их в объекте Application. Никогда не запускайте задачи в Activity, так как они будут уничтожены при изменениях конфигурации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...