NoneAndroid : поддержка: фрагменты, сохраненные Activity, становятся больше и вызывают TransactionTooLargeException

У меня есть активность, которая контролирует несколько фрагментов. Фрагмент по умолчанию HomepageFragment, При замене на другой фрагмент я всегда проверяю, что стек остается плоским - это означает, что HomepageFragment остается в стеке и поверх него текущий фрагмент. Например:

  1. Активность открыта с HomepageFragment
  2. Заменить на FragmentA нужно - все хорошо HomepageFragment последний фрагмент
  3. Теперь стек HomepageFragment -> FragmentA
  4. Заменить на FragmentB необходимо - сначала вытолкнуть последний фрагмент в стек (fragmentA) чем заменить на FragmentB
  5. Теперь стек HomepageFragment -> FragmentB

На производстве я вижу много TransactionTooLargeException сбои.

я использовал TooLargeTool отследить, откуда возникла проблема, и я обнаружил, что при переключении между фрагментами в действии возникает android:support:fragments ключ в SaveInstanceState который становится все больше и больше (экспоненциально), пока не произойдет сбой.

Кажется, что даже при извлечении из стека некоторые данные, относящиеся к исходной транзакции, продолжают сохраняться.

Удаление его, как предлагается здесь, приводит к тому, что Activity не восстанавливается должным образом после уничтожения этой ОС.

Что-то не так с моим методом выравнивания стека? Есть ли лучший подход? Какие именно данные сохраняются в android:support:fragments?

Примечание: я не привожу никаких аргументов к этим фрагментам. Кроме того, они сохраняют очень маленькие данные в своем пакете saveInstanceState.

Спасибо!

1 ответ

В моем случае виновником был аргумент навигации - пользовательский Parcelable, размер которого мог увеличиваться до нескольких сотен килобайт. С несколькими из них в заднем стеке приложение перешагнет порог в 1 МБ и выйдет из строя.

Я решил проблему, передав только идентификатор этого Parcelable и загрузив его из моего репозитория. Небольшое снижение производительности, но больше никаких сбоев.