Существует ли шаблон проектирования, позволяющий сократить дублирование кода при создании подклассов Activity в Android? - PullRequest
5 голосов
/ 06 апреля 2010

У меня есть общая задача, которую я выполняю с некоторыми действиями - загрузка данных с последующим их отображением. У меня есть часть для скачивания; это, конечно, немного сложно из-за возможности изменения пользователем ориентации или отмены Активности до завершения загрузки, но код есть. В этих случаях достаточно обработки кода, так что мне не нужно копировать / вставлять его в каждое имеющееся у меня действие, поэтому я подумал о создании самого абстрактного подкласса такого действия, чтобы он обрабатывал одну фоновую загрузку, которая затем запускает метод который заполняет страницу данными.

Это все работает. Проблема в том, что из-за одиночного наследования я вынужден воссоздать точно такой же класс для любого другого типа Activity - например, я использую Activity, ListActivity и MapActivity. Чтобы использовать одну и ту же технику для всех трех, требуются три повторяющихся класса, за исключением того, что каждый расширяет свою деятельность.

Существует ли шаблон проектирования, который может сократить дублирование кода? В настоящее время я уже сохранил много дубликатов, но мне больно видеть один и тот же код в трех классах, просто чтобы каждый из них был подклассом своего типа Activity.

Редактировать: Поскольку мне кажется, мне нужно быть немного более конкретным ...

Предположим, я пытаюсь решить проблему фоновой загрузки AsyncTask во время изменения ориентации. Решение, которое я имею сейчас, состоит в том, чтобы использовать обратные вызовы; у меня есть менеджер загрузок, который запускает эти загрузки, а затем я прикрепляю к нему активность. Когда ориентация меняется, действие уничтожается, а затем воссоздается; во время этого процесса я отсоединяю обратный вызов старой активности, а затем присоединяю новый обратный вызов от новой активности.

Изменения в ориентации являются распространенной проблемой, и в нескольких операциях я запускаю операцию с видом прогресса, пока загружаются данные. То, что я пытаюсь решить, - это не повторять эту логику обработки ориентации десять раз; Моим первоначальным решением было создание подкласса Activity, но потом я получил проблему выше.

Ответы [ 4 ]

3 голосов
/ 06 апреля 2010

Предпочитаю композицию наследованию .Что бы ни было общим, делегируйте какой-либо класс (ы), которые могут быть членами Activity, ListActivity и MapActivity.

0 голосов
/ 07 апреля 2010

Есть ли у вас какой-нибудь вспомогательный класс со статическими методами, в который вы будете передавать свои действия и выполнять общую работу вместо каждого упражнения?

0 голосов
/ 07 апреля 2010

Я не использовал MapActivity, но решил эту проблему, не используя ListActivity и самостоятельно предоставляя функциональность в Activity. В ListActivity действительно не так много, если вы посмотрите: http://google.com/codesearch/p?hl=en#uX1GffpyOZk/core/java/android/app/ListActivity.java Реализуйте функциональность самостоятельно, вы получите больше настроек и больше возможностей для роста.

0 голосов
/ 06 апреля 2010

Проблема в том, что вы смешиваете представление и логику вашей программы. Фоновый поток, такой как AsyncTask , будет работать до тех пор, пока ваше приложение не будет удалено из системы. Вы можете выполнить загрузку всего в асинхронной задаче, а затем сохранить ее где-нибудь на SD-карте, чтобы извлечь ее оттуда, если она будет готова.

Вы можете создать подкласс класса приложения для хранения ссылки на задачу или обработчика для связи с классом из каждого Activity.

Если это вообще не решение вашей проблемы, возможно, вы могли бы немного прояснить вопрос. Это помогло бы узнать, что вы делаете в методах onCreate ....

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