NoneAndroid : поддержка: фрагменты, сохраненные Activity, становятся больше и вызывают TransactionTooLargeException
У меня есть активность, которая контролирует несколько фрагментов. Фрагмент по умолчанию HomepageFragment
, При замене на другой фрагмент я всегда проверяю, что стек остается плоским - это означает, что HomepageFragment
остается в стеке и поверх него текущий фрагмент. Например:
- Активность открыта с
HomepageFragment
- Заменить на
FragmentA
нужно - все хорошоHomepageFragment
последний фрагмент - Теперь стек
HomepageFragment
->FragmentA
- Заменить на
FragmentB
необходимо - сначала вытолкнуть последний фрагмент в стек (fragmentA
) чем заменить наFragmentB
- Теперь стек
HomepageFragment
->FragmentB
На производстве я вижу много TransactionTooLargeException
сбои.
я использовал TooLargeTool
отследить, откуда возникла проблема, и я обнаружил, что при переключении между фрагментами в действии возникает android:support:fragments
ключ в SaveInstanceState
который становится все больше и больше (экспоненциально), пока не произойдет сбой.
Кажется, что даже при извлечении из стека некоторые данные, относящиеся к исходной транзакции, продолжают сохраняться.
Удаление его, как предлагается здесь, приводит к тому, что Activity не восстанавливается должным образом после уничтожения этой ОС.
Что-то не так с моим методом выравнивания стека? Есть ли лучший подход? Какие именно данные сохраняются в android:support:fragments
?
Примечание: я не привожу никаких аргументов к этим фрагментам. Кроме того, они сохраняют очень маленькие данные в своем пакете saveInstanceState.
Спасибо!
1 ответ
В моем случае виновником был аргумент навигации - пользовательский Parcelable, размер которого мог увеличиваться до нескольких сотен килобайт. С несколькими из них в заднем стеке приложение перешагнет порог в 1 МБ и выйдет из строя.
Я решил проблему, передав только идентификатор этого Parcelable и загрузив его из моего репозитория. Небольшое снижение производительности, но больше никаких сбоев.