TransactionTooLargeException al iniciar nueva Actividad

Pensé que el límite extra de la Intención en tamaño era de 1 MB, según se informó en los documentos . De todos modos, perdí un día persiguiendo este terrible TransactionTooLargeException :

  E/JavaBinder(368): !!! FAILED BINDER TRANSACTION !!! Exception when starting activity android/com.android.internal.app.ChooserActivity android.os.TransactionTooLargeException at android.os.BinderProxy.transact(Native Method) at android.app.ApplicationThreadProxy.scheduleLaunchActivity(ApplicationThreadNative.java:705) at com.android.server.am.ActivityStack.realStartActivityLocked(ActivityStack.java:690) at com.android.server.am.ActivityStack.startSpecificActivityLocked(ActivityStack.java:799) at com.android.server.am.ActivityStack.resumeTopActivityLocked(ActivityStack.java:1743) at com.android.server.am.ActivityStack.resumeTopActivityLocked(ActivityStack.java:1381) at com.android.server.am.ActivityStack.completePauseLocked(ActivityStack.java:1129) at com.android.server.am.ActivityStack.activityPaused(ActivityStack.java:1027) at com.android.server.am.ActivityManagerService.activityPaused(ActivityManagerService.java:4288) at android.app.ActivityManagerNative.onTransact(ActivityManagerNative.java:381) at com.android.server.am.ActivityManagerService.onTransact(ActivityManagerService.java:1611) at android.os.Binder.execTransact(Binder.java:367) at dalvik.system.NativeStart.run(Native Method) 

Lo malo es que startActivity falla, pero ActivityManager sigue reiniciándola una y otra vez, generando procesos infinitos. Esto parece ser confirmado en esta entrada del blog, donde el autor indica un "límite" de 86389 caracteres . Mi pieza de código relevante es bastante simple:

  Intent myIntent = new Intent(activity, VacancySwipeActivity.class); //myIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); Bundle ex = new Bundle(); ex.putSerializable(Constants.Extra.VACANCY, vacancies); ex.putString("token", token); ex.putString("cosa", cosa.getText().toString()); ex.putInt("dist", searchDistance.getProgress()); ex.putString("dove", dove.getText().toString()); if (ret.getSearchLocation() != null) { ex.putParcelable("userLoc", ret.getSearchLocation()); } ex.putInt("totRows", ret.getTotFound()); myIntent.putExtras(ex); activity.startActivity(myIntent); 

Las vacantes de ArrayList son muy pequeñas, alrededor de 8 POJO, que se cargan en un hilo y luego pasan a una nueva actividad a través del extra de Intent. Si la aumento a cerca de 90k, los lazos de la aplicación indefinidamente que requieren un reinicio, una molestia real. ¿Alguien más lo ha experimentado ?

El límite se supone que es de 1MB, pero varía por dispositivo de poco menos de 512KB hasta casi un 1MB completo. Aparte de eso tienes otro problema aquí. Está poniendo un ArrayList como un extra que está bien ya que ArrayList implementa Serializable. Pero si usted piensa que android serializará esta lista a byte [] y la transferencia que usted está equivocado. Se serializar cada elemento por su cuenta y la transferencia que. Y eso es mucho más ineficiente de lo que parece. Debería ajustar la ArrayList en un objeto contenedor que implementa Serializable y eso hará una gran diferencia. Vea esta entrada en el blog (mina) para más detalles.

Tuve el mismo problema, lo resolvió haciendo un Hashtable Singelton fueron guardar mi cadena "larga", y dar sólo la clave en la intención.

  • Enviar formulario con datos POST en la aplicación para Android
  • ¿Se necesita permiso para usar Intent para llamar al teléfono?
  • Android: Pasar datos (extras) a un fragmento
  • ¿Existe la intención de lanzar Android Market a la página "Mis aplicaciones"?
  • Obtener resultado de una actividad después de terminar (); En una prueba de unidad de Android
  • Acceso directo para iniciar una actividad
  • Transmitir datos a onDestroy () de Service
  • El envío de una nueva intención a un receptor de radiodifusión da valores extras de intenciones anteriores
  • Enviar objeto como parcela (con descriptores de archivo) a través de la intención provoca una excepción
  • Java.lang.RuntimeException: Handler (android.os.Handler) envío de mensajes a un Handler en un hilo muerto
  • Prueba de que el botón inicia una Actividad con Robolectric
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.