Ограничение размера Intent.putExtras? - PullRequest
5 голосов
/ 22 февраля 2012

Я пытаюсь передать данные из одного действия в другое через Intent.putExtras, например:

private ArrayList<HashMap<String, String>> mGroups = new ArrayList<HashMap<String, String>>();
private ArrayList<HashMap<String, String>> mUsers = new ArrayList<HashMap<String, String>>();
...

Bundle data = new Bundle();
data.putInt("mode", mode);
data.putSerializable("groups", (Serializable) mGroups);
data.putSerializable("users", (Serializable) mUsers);
data.putInt("current_class", mCurrentClassId);
data.putInt("current_user", mCurrentUserId);

Intent intent = new Intent(ctx, ChildActivity.class);
intent.putExtras(data);
ctx.startActivityForResult(intent, 0);

Здесь mUsers - это список HashMap<String,String> с пользовательскими данными, включая фотографию в кодировке Base64, сумма размеров строк в этом списке составляет около 500 КБ

Звонок на startActivityForResult зависает на несколько минут с черным экраном, а затем я получаю ошибку ANR. Подэтап onCreate вообще не вызывается.

Если я не добавляю большие строки в mUsers (без фотографий в кодировке Base64) - все работает отлично.

Пожалуйста, помогите.

Ответы [ 2 ]

7 голосов
/ 22 февраля 2012

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

Решение @ Jean-Philippe Roy (québec?) Интересно, но синглтон - это довольно антипаттерн, когда речь идет о более сложных вещах, а именно о моделях Statefull или сервисах.

Лучший вариант - использовать класс приложения. Этот класс - твой синглтон, по природе в андроиде. Таким образом,

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

--- Обновлено после ответа @ straya и еще 18 месяцев программирования на Android:)

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

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

Сейчас я предпочитаю использовать управляемые синглтоны Dependency Injection. Dagger или RoboGuice позволяют создавать и внедрять один экземпляр данного класса в другие классы. Эта техника и DI в целом предлагают большие возможности для хороших дизайнов Android:

  • не ухудшают качество кода, он даже значительно сокращен. Используйте @Inject для внедрения зависимостей, и они будут внедрены.
  • не возлагайте 2 ответственности на одноэлементный класс: он не будет обрабатывать создание одноэлементного экземпляра, фреймворк сделает это.
  • проще перейти от одиночного к нормальному экземпляру
  • , поскольку эти синглтоны становятся обычными классами с простой аннотацией, они больше не содержат статических методов, что позволяет очень легко их высмеивать. И это важный момент.
  • и, конечно, аннотации DI очень ясно показывают, когда класс зависит от другого класса, помогая больше самостоятельно документировать код.
0 голосов
/ 25 февраля 2012

Только в ответ на ответ Сниколаса:

Приложение уже является Синглтоном, не нужно «превращать его» в одно.

Лично, после некоторой серьезной зависимости от приложения для хранения данных в течение длительного времени, я пришел к тому, что полностью ему не доверял. Я использую объекты данных с само-кэшированием, чтобы смягчить проблемы;)

...