#android #android-lifecycle #android-7.0-nougat #onrestoreinstancestate #onsaveinstancestate
#Android #android-жизненный цикл #android-7.0-nougat #onrestoreinstancestate #onsaveinstancestate
Вопрос:
Android 7.0 запускает исключение TransactionTooLargeException при восстановлении состояния экземпляра, если размер посылки превышает лимит.
Но мое приложение должно сохранять загруженный контент, размер которого не ограничен. Так что вызвать эту ошибку очень легко.
Безопасно ли сохранять состояние экземпляра в экземпляре приложения?
Будет ли оно удалено, пока действие выполняется в фоновом режиме?
Есть ли способ сохранить большие данные без создания этого исключения?
Комментарии:
1. Поскольку мы не знаем характер хранимых данных, будет много вариантов. Используйте загрузчик или SharedPreferences или переменную в сохраненном фрагменте, поддерживаемом SharedPreferences/File / etc .
2. Я должен сохранить данные, которые мое приложение загружает с сервера. И данные будут проанализированы в какой-то сложный объект. В этом случае нельзя использовать ни Loader, ни SharedPreferences. И фрагмент будет уничтожен после того, как Android убьет мое приложение, как в этом случае может работать сохраненный фрагмент? Что я действительно хочу знать, так это как сохранить большие данные и восстановить их, когда приложение будет убито Android?
3. Когда ваше приложение уничтожается, оно не существует в памяти. Таким образом, любые данные должны быть загружены из постоянной модели / хранилища. Ваш набор данных должен сохраняться на жестком диске и загружаться в объекты по мере необходимости. Сохраненное состояние не является инструментом для сохранения всей вашей модели.
4. Вы имеете в виду, что я должен сохранять его в базе данных или кеше каждый раз, когда вызывается onSaveInstanceState ?
5. Совсем нет. Каждый раз, когда вы извлекаете данные из Интернета, вы сохраняете их в хранилище, и каждый раз, когда данные в хранилище меняются, вы транслируете изменения в пользовательский интерфейс. Ваша модель данных никогда не затрагивает сохраненное состояние.
Ответ №1:
Чтобы ответить на эти вопросы один за другим :
- Безопасно ли сохранять состояние экземпляра в экземпляре приложения?
Нет, если вы хотите получить эти данные после того, как процесс вашего приложения был уничтожен ОС и позже восстановлен. Для этого вам нужно каким-то образом сохранить данные на диске. Для правильной обработки состояния сохранения всегда есть две части: обработка изменений конфигурации (например, поворотов), которые не связаны с завершением процесса, и фактическое завершение процесса и восстановление. Помещение состояния в экземпляр приложения (или любой синглтон) решает первую проблему, но не вторую.
- Будет ли оно удалено, пока действие выполняется в фоновом режиме?
Зависит от того, что вы подразумеваете под «в фоновом режиме». Иногда это может означать «действие существует, но находится в остановленном состоянии». В этом случае ваши данные в порядке. Но весь процесс вашего приложения может быть остановлен, пока приложение находится в фоновом режиме, а затем восстановлен при возвращении. В этом случае ваши данные исчезнут, если они не будут должным образом сохранены где-либо на диске.
- Есть ли способ сохранить большие данные без создания этого исключения?
Да, запишите его в базу данных и восстановите данные оттуда. Кроме того, вы можете использовать эту библиотеку, которая автоматически обрабатывает сохранение / восстановление ваших пакетов на / с диска для вас: https://github.com/livefront/bridge .
Комментарии:
1. Хотя я решил все эти проблемы 2 года назад, все равно спасибо за ответ. Не знал, что есть библиотека для обработки ограничений Android. Сейчас я восстанавливаю данные из базы данных Realm.
2. Нет проблем. И использование базы данных Realm — отличный способ.