Хорошие альтернативы для разделения сложного дерева объектов между действиями в Android?

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

Позволять'скажем, у вас есть Activity, которая загружает сложное дерево данных (в данном случае через json, но это может быть что угодно), демарширует эти данные в набор объектов java (в этом случае, используя gson, но опять же, может быть что угодно) затем создает дополнительные действия для просмотра различных частей этих данных. Может быть одно действие для просмотра рейсов в вашем ответе, другое - для просмотра рейсов в этих поездках, а другое - для просмотра пассажиров этих рейсов.

Моя первоначальная реализация этого приложения состояла в том, чтобы разобрать все отключения в первом упражнении, а затем передать их по значению (как дополнение в намерении) в TripActivity. Затем TripActivity передает отдельные полеты в FlightActivity и т. Д.

Проблема в том, что тамЗаметная пауза между действиями, когда приложение сериализует и десериализует данные. Мы'говорим несколько секунд. Пауза очень заметна, когда мое дерево использует Serialization или Parcelable для передачи данных. Начальное тестирование производительности с использованием Google 'Вместо этого Parcelable показывает примерно 30% ускорение по сравнению с сериализацией, но с Parcelable трудно работать, и он неПохоже, что он обрабатывает циклические ссылки на объекты хорошо, как это делает сериализация, и, кроме того, он все еще останавливается на столько же секунд, так что яЯ поставил этот эксперимент на задний план, пока я пробую другие вещи.

Затем я попытался переместить дерево объектов непосредственно в класс Application. Каждое действие просто получает дерево непосредственно из приложения, когда оно ему необходимо. Это делает производительность довольно быстрой, но обработка угловых случаев, таких как неожиданный запуск / остановка активности (либо из-за сбоев активности, либо из-за того, что действие было временно закрыто, чтобы освободить больше памяти, или по любой другой причине), кажется сложной. Возможно этоне более, чем реализацияonSaveInstanceState()ЯЯ не уверен, но решение кажется немного хакерским, поэтому я непока не исследовано.

Поэтому в поисках менее сложного решения я попытался создать собственный ContentProvider для хранения и извлечения своих объектов. Поскольку ContentProviders можно настроить для запуска в процессе с использованиемmultiprocess=trueЯ подумал, что это будет отличным способом избежать затрат на сериализацию при выполнении чего-то большего "стандарт» чем хранение данных в объекте приложения. Однако ContentProviders явно не предназначались для возврата произвольных типов объектов - они поддерживают только такие типы, как числа, строки, логические значения и т. Д. Похоже, я могу найти один для хранения произвольных объектов, используяContentResolver.getContentProviderClient().getLocalContentProvider() и получить доступ к своему пользовательскому классу напрямую, но яя не уверен, чтоменее хакерский, чем хранение данных в объекте Application.

Конечно, кто-то должен иметь хорошее решение этой проблемы. Что я делаю неправильно?

Ответы на вопрос(3)

Решение Вопроса

В дополнение к fiXedd 'Решение, другое - использовать локальный сервис. Есть служба "своя" объекты с действиями, вызывающими сервисные API, чтобы получить все, что ему нужно. Служба также может отвечать за выборку и анализ данных, инкапсулируя этот бит логики.

Application объект "рыжий падчерица " компонентов Android. Члены основной команды Android выступили против практики создания пользовательскихApplication подклассы, хотя это, безусловно, поддерживается API. Разработав одно приложение ADC2 200, которое использовало пользовательскийApplication подкласс, я могу сказать, что я должен был пойти с услугой в моем случае, а также. Живи и учись...

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

 emmby11 нояб. 2009 г., 23:25
Да, я думаюм в аналогичной лодке. Начал делать все в приложении, и теперь сервис выглядит как правильный путь. Я буду исследовать рефакторинг в какой-то момент. Спасибо за чаевые!
 Lou Morda18 дек. 2012 г., 18:00
Я также предпочитаю обслуживание. Что вы подразумеваете под "своя"? Вы сохраняете данные в статический объект в сервисе? Обычно служба анализирует данные и затем отправляет эти данные в широковещательную рассылку, а затем в потоке пользовательского интерфейса используется обработчик для отображения данных или чего-либо еще. Но если я снова позвоню в службу, откуда служба снова получит эти данные? Сохраняются ли эти данные в статическом объекте в сервисе? Мы нене хочу снова анализировать JSON ..

Другой подход заключается в сохранении объектов данных в общем файле настроек. Тот'Как мы реализовали одно из наших приложений, но я неМне не нравится такой подход, потому что он кажется слишком медленным.

Это'Это плохая практика кодирования, но самый быстрый способ может заключаться в том, чтобы просто использовать сервис для анализа данных и сохранения данных в статическом классе, который вы можете использовать для остальной части приложения ».жизнь

загружая данные и помещая их в базу данных. Так я немне нужно носить с собой все эти объекты (которые, по оценкам IIRC, потребляют около 1 Кбайт только для создания экземпляра объекта), и я легко могу получить только те данные, которые мне нужны. Я неНе знаю, сработает ли это для вас, но это сработало для моего варианта использования.

 Lou Morda18 дек. 2012 г., 18:04
Мы попробовали это на моей текущей работе, но приложение продолжало зависать и / или зависать при попытке прочитать или сохранить данные в базе данных. Я'я пытаюсь держаться подальше от баз данных SQLite отныне ...

Ваш ответ на вопрос