Хорошие альтернативы для разделения сложного дерева объектов между действиями в 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.
Конечно, кто-то должен иметь хорошее решение этой проблемы. Что я делаю неправильно?