Sobes.tech
Middle

Mi az a TransactionTooLargeException kivétel?

sobes.tech MI

Válasz az MI-től

A TransactionTooLargeException kivétel akkor fordul elő, amikor az alkalmazás komponensei között (például Activity-ből Service-be vagy folyamatok között) a Binder-en keresztül továbbított adatok mérete meghaladja a megengedett határt.

A Binder egy folyamatok közötti kommunikációs (IPC) mechanizmus Androidon. Fix puffert használ az adatok átviteléhez. Ennek a puffernek a mérete korlátozott, általában 1 MB-ig (plusz néhány szolgáltatási információ). Amikor adatokat próbálsz átvinni Binder-en keresztül, és az adatok mérete meghaladja ezt a határt, a rendszer TransactionTooLargeException-t dob.

Ez általában akkor fordul elő, amikor:

  • Nagy objektumokat továbbítasz Intent-tel (például szériázott adatok, Bitmapek).
  • AIDL-szolgáltatásokkal dolgozol, amikor a metódusok nagy mennyiségű adatot adnak vissza vagy fogadnak.
  • Bundle-t használsz adatok átadására a komponensek között.

A probléma megoldásának módjai:

  • Csak a szükséges adatokat továbbítani.
  • Nagy adatokat memóriában vagy lemezen tárolni, és csak hivatkozást átadni (például URI, azonosító).
  • Más adatátviteli mechanizmusokat használni nagy adatmennyiség esetén (például helyi socketek, médiakiszolgálók).
  • Nagy adatokat kisebb részekre bontani, és több tranzakcióban továbbítani.
// Példa, ami TransactionTooLargeException-hez vezethet
Intent intent = new Intent(this, TargetActivity.class);
Bundle bundle = new Bundle();
byte[] largeData = new byte[1024 * 1024 * 2]; // 2MB adat
bundle.putByteArray("data", largeData);
intent.putExtra("bundle", bundle);
startActivity(intent); // Itt kiváltható kivétel