Chaque fois que vous voyez TransactionTooLargeException
qui se produit lorsqu'un Activity
est en train de s'arrêter, cela signifie que la Activity
essayait d'envoyer son état sauvegardé Bundles
au système d'exploitation du système afin de le conserver en toute sécurité pour le restaurer ultérieurement (après un changement de configuration ou la mort d'un processus), mais qu'un ou plusieurs des éléments suivants soient conservés Bundles
qu'il a envoyés étaient trop grands. Il existe une limite maximale d'environ 1 Mo pour toutes les transactions de ce type qui se produisent en même temps, et cette limite peut être atteinte même si aucune transaction de ce type n'est envoyée. Bundle
dépasse cette limite.
Le principal coupable ici est généralement de sauvegarder trop de données à l'intérieur onSaveInstanceState
de l'un ou l'autre des Activity
ou tout Fragments
organisé par le Activity
. Cela se produit généralement lors de la sauvegarde d'un objet particulièrement volumineux, tel qu'un fichier de type Bitmap
mais cela peut également se produire lors de l'envoi de grandes quantités de données plus petites, comme des listes de Parcelable
objets. L'équipe Android a précisé à de nombreuses reprises que seules de petites quantités de données liées à la vue devaient être sauvegardées dans les objets suivants onSavedInstanceState
. Cependant, les développeurs ont souvent sauvegardé des pages de données réseau afin que les changements de configuration apparaissent aussi fluides que possible en n'ayant pas à récupérer à nouveau les mêmes données. Depuis la Google I/O 2017, l'équipe Android a clairement indiqué que l'architecture préférée pour une application Android enregistre les données de réseau.
- en mémoire afin qu'il puisse être facilement réutilisé lors de changements de configuration.
- sur le disque afin qu'il puisse être facilement restauré après la mort du processus et des sessions d'applications.
Leur nouvelle ViewModel
cadre et Room
sont destinés à aider les développeurs à s'adapter à ce modèle. Si votre problème est de sauvegarder trop de données dans des fichiers onSaveInstanceState
la mise à jour vers une architecture comme celle-ci en utilisant ces outils devrait résoudre votre problème.
Personnellement, avant d'effectuer une mise à jour vers ce nouveau modèle, j'aimerais prendre mes applications existantes et contourner la TransactionTooLargeException
pendant ce temps. J'ai écrit une bibliothèque rapide pour faire cela : https://github.com/livefront/bridge . Il utilise les mêmes idées générales de restauration de l'état à partir de la mémoire lors des changements de configuration et à partir du disque après la mort du processus, plutôt que d'envoyer tout cet état au système d'exploitation par l'intermédiaire de l'application onSaveInstanceState
mais ne nécessite qu'un minimum de modifications de votre code existant pour être utilisé. Toute stratégie qui répond à ces deux objectifs devrait vous permettre d'éviter l'exception, sans pour autant sacrifier votre capacité à sauvegarder l'état.
Une dernière remarque ici : la seule raison pour laquelle vous voyez cela sur Nougat+ est qu'à l'origine, si la limite de transaction du binder était dépassée, le processus d'envoi de l'état sauvegardé à l'OS échouait silencieusement avec seulement cette erreur apparaissant dans Logcat :
! !! TRANSACTION DE LIANT RATÉE ! !!
Dans Nougat, cette défaillance silencieuse est passée à un crash dur. À leur crédit, c'est quelque chose que l'équipe de développement a documenté dans les notes de mise à jour de Nougat :
De nombreuses API de plate-forme ont maintenant commencé à vérifier les charges utiles volumineuses envoyées par les transactions de Binder, et le système renvoie maintenant les TransactionTooLargeExceptions comme RuntimeExceptions, au lieu de les consigner ou de les supprimer silencieusement. Un exemple courant est le stockage d'une trop grande quantité de données dans Activity.onSaveInstanceState(), ce qui entraîne l'envoi d'une exception d'exécution par ActivityThread.StopInfo lorsque votre application cible Android 7.0.
0 votes
Écrire la classe où avec apparaissent. cela signifie que vous avez une classe avec des parces avec beaucoup de données.
0 votes
stackoverflow.com/questions/11451393/
1 votes
C'est là le problème. Dans la plupart des cas, je n'envoie qu'un petit objet compressible avec peu de chaînes de caractères. J'obtiens cette erreur à chaque transition d'activité. Sur d'autres appareils, cela fonctionne sans problème.
6 votes
Il a été signalé comme un bogue, voir code.google.com/p/Android/issues/detail?id=212316