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í
Bundlena 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