Sobes.tech
Middle

Čo je výnimka TransactionTooLargeException?

sobes.tech AI

Odpoveď od AI

Výnimka TransactionTooLargeException nastáva, keď údaje prenášané medzi komponentmi aplikácie (napríklad z Activity do Service alebo medzi procesmi) cez Binder prekročia povolený limit veľkosti.

Binder je mechanizmus medziprocesovej komunikácie (IPC) v Android. Má pevný buffer na prenos dát. Veľkosť tohto bufferu je obmedzená, zvyčajne do 1 MB (plus niektoré servisné informácie). Keď sa pokúsite preniesť údaje cez Binder a ich veľkosť prekročí tento limit, systém vyhodí TransactionTooLargeException.

Zvyčajne sa to stáva pri:

  • Prenose veľkých objektov cez Intent (napríklad serializované údaje, Bitmapy).
  • Práci so službami AIDL, keď metódy vracajú alebo prijímajú veľké objemy údajov.
  • Použití Bundle na prenos údajov medzi komponentmi.

Spôsoby riešenia problému:

  • Prenášať iba potrebné údaje.
  • Ukladať veľké údaje do pamäte alebo na disk a prenášať iba odkaz na ne (napríklad URI, identifikátor).
  • Používať iné mechanizmy prenosu údajov pre veľké objemy (napríklad lokálne sokety, mediálni poskytovatelia).
  • Rozdeľovať veľké údaje na menšie časti na prenos v niekoľkých transakciách.
// Príklad, ktorý môže viesť k TransactionTooLargeException
Intent intent = new Intent(this, TargetActivity.class);
Bundle bundle = new Bundle();
byte[] largeData = new byte[1024 * 1024 * 2]; // 2MB údajov
bundle.putByteArray("data", largeData);
intent.putExtra("bundle", bundle);
startActivity(intent); // Tu môže byť vyvolaná výnimka