Sobes.tech
Middle

Co je výjimka TransactionTooLargeException?

sobes.tech AI

Odpověď od AI

Výjimka TransactionTooLargeException nastává, když data přenášená mezi komponentami aplikace (například z Activity do Service nebo mezi procesy) přes Binder překročí povolený limit velikosti.

Binder je mechanismus meziprocesové komunikace (IPC) v Androidu. Má pevný buffer pro přenos dat. Velikost tohoto bufferu je omezená, obvykle do 1 MB (plus nějaké servisní informace). Když se pokusíte přenést data přes Binder a jejich velikost překročí tento limit, systém vyvolá TransactionTooLargeException.

Obvykle se to stává při:

  • Přenosu velkých objektů přes Intent (například serializovaná data, Bitmapy).
  • Práci se službami AIDL, když metody vracejí nebo přijímají velké objemy dat.
  • Použití Bundle pro přenos dat mezi komponentami.

Možnosti řešení:

  • Přenášet pouze nezbytná data.
  • Velká data ukládat do paměti nebo na disk a přenášet pouze odkaz na ně (například URI, identifikátor).
  • Používat jiné mechanismy přenosu dat pro velké objemy (například lokální sockety, mediální poskytovatelé).
  • Rozdělit velká data na menší části pro přenos v několika transakcích.
// Příklad, který může vést k TransactionTooLargeException
Intent intent = new Intent(this, TargetActivity.class);
Bundle bundle = new Bundle();
byte[] largeData = new byte[1024 * 1024 * 2]; // 2MB dat
bundle.putByteArray("data", largeData);
intent.putExtra("bundle", bundle);
startActivity(intent); // Zde může být vyvolána výjimka