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:
- Transmitir entero entre actividades e intentos en Android siempre resulta en cero / nulo
- Android: obtener el ancho de Layout programatically teniendo fill_parent en su xml
- ¿Por qué Intent implementa Cloneable?
- Ninguna actividad encontrada para manejar Intent, Android
- Error al iniciar la actividad debido a ClassNotFoundException
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 ?
- Android: la actividad está utilizando la intención antigua si se inicia la aplicación desde la tarea reciente
- ¿Cómo paso un uuid en una intención?
- Usando la intención de llamar a un fragmento de otro fragmento
- Android "java.lang.RuntimeException: Parcelable encontróClassNotFoundException leyendo un objeto Serializable"
- Android: pasando parámetros entre clases
- Cómo encontrar las intenciones "públicas" que podemos usar al usar otras aplicaciones en nuestras aplicaciones
- Intentos pendientes no disparados
- Android: Inicie el servicio con Context.startService vs PendingIntent.getService
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.
- Error al consultar el inventario: Error al actualizar el inventario
- Ocultar ImageView cuando aparezca el teclado y mostrarlo cuando desaparezca el teclado