Problema de limitación de tamaño de datos de transferencia de intención: android.os.TransactionTooLargeException: tamaño de paquete de datos xxxxxxx bytes

Dos saltos de actividad, generalmente usamos Intent para pasar datos, pero si los datos pasados ​​son demasiado grandes, ocurrirán las siguientes excepciones:

2020-10-23 09:52:22.142 5506-5506 E/AndroidRuntime: FATAL EXCEPTION: main
    Process: jdlf_scgl_zp_android.ui.m990_system, PID: 5506
    java.lang.RuntimeException: Failure from system
        at android.app.Instrumentation.execStartActivity(Instrumentation.java:1525)
        at android.app.Activity.startActivityForResult(Activity.java:4226)
        at android.app.Activity.startActivityForResult(Activity.java:4185)
        at jdlf_scgl_zp_android.ui.m039_ui_mat_distribution.MatDistributionManager.PickListManager.PickListToLightOperateActivity.jumpToMoveWare(PickListToLightOperateActivity.java:426)
        at jdlf_scgl_zp_android.ui.m039_ui_mat_distribution.MatDistributionManager.PickListManager.PickListToLightOperateActivity.onClick(PickListToLightOperateActivity.java:165)
        at jdlf_scgl_zp_android.ui.m039_ui_mat_distribution.MatDistributionManager.PickListManager.-$$Lambda$qSbxt2tr_nrJz4nnSCo7yUGOiUU.onClick(lambda)
        at android.view.View.performClick(View.java:5675)
        at android.view.View$PerformClick.run(View.java:22641)
        at android.os.Handler.handleCallback(Handler.java:836)
        at android.os.Handler.dispatchMessage(Handler.java:103)
        at android.os.Looper.loop(Looper.java:203)
        at android.app.ActivityThread.main(ActivityThread.java:6251)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1063)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:924)
     Caused by: android.os.TransactionTooLargeException: data parcel size 2435216 bytes
        at android.os.BinderProxy.transactNative(Native Method)
        at android.os.BinderProxy.transact(Binder.java:622)
        at android.app.ActivityManagerProxy.startActivity(ActivityManagerNative.java:3191)
        at android.app.Instrumentation.execStartActivity(Instrumentation.java:1518)
        at android.app.Activity.startActivityForResult(Activity.java:4226) 
        at android.app.Activity.startActivityForResult(Activity.java:4185) 
        at jdlf_scgl_zp_android.ui.m039_ui_mat_distribution.MatDistributionManager.PickListManager.PickListToLightOperateActivity.jumpToMoveWare(PickListToLightOperateActivity.java:426) 
        at jdlf_scgl_zp_android.ui.m039_ui_mat_distribution.MatDistributionManager.PickListManager.PickListToLightOperateActivity.onClick(PickListToLightOperateActivity.java:165) 
        at jdlf_scgl_zp_android.ui.m039_ui_mat_distribution.MatDistributionManager.PickListManager.-$$Lambda$qSbxt2tr_nrJz4nnSCo7yUGOiUU.onClick(lambda) 
        at android.view.View.performClick(View.java:5675) 
        at android.view.View$PerformClick.run(View.java:22641) 
        at android.os.Handler.handleCallback(Handler.java:836) 
        at android.os.Handler.dispatchMessage(Handler.java:103) 
        at android.os.Looper.loop(Looper.java:203) 
        at android.app.ActivityThread.main(ActivityThread.java:6251) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1063) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:924) 

La información clave de la excepción son estas dos líneas:

java.lang.RuntimeException: Failure from system
Caused by: android.os.TransactionTooLargeException: data parcel size 2435216 bytes

De hecho, supe esta conclusión muy pronto, pero nunca encontré este problema en mi impresión. Me he encontrado con este problema varias veces recientemente y las razones siguen siendo diferentes:

  • Después de que la página de firma definida por el usuario esté firmada, firmará una imagen y la enviará a la página anterior. Debido a que el objeto de mapa de bits pasa a través de la imagen, la cantidad de datos es demasiado grande;
  • Para pasar la colección ArrayList, esto es lo que usamos a menudo. Al principio, no pensamos que fuera un problema con ArrayList. Después de mirar el registro, hay más de 1200 datos en la Lista, y la Lista serializada ha alcanzado 1,5 M;
  • El formulario Actividad + Visor + Fragmento usa Bundle cuando se transfieren datos a Fragment, y la cantidad de datos transportados en el Bundle es demasiado grande.

1. La primera solución es almacenar el mapa de bits como una matriz de bytes y luego pasarlo por Intent:

 ByteArrayOutputStream baos = new ByteArrayOutputStream();
 mBitmap.compress(Bitmap.CompressFormat.JPEG, 50, baos);
 byte[] bytesArrayBmp = baos.toByteArray();
 intent.putExtra(SIGN_PIC_BITMAP, bytesArrayBmp);

Entonces, ¿por qué se puede transferir Bitmap a una matriz de bytes? Mi entendimiento personal es que Bitmap implementa la interfaz de serialización Parcelable, por lo que todos los datos de Bitmap se serializarán en la memoria cuando se transfieran, por lo que excederá el límite de 1M. La matriz de bytes corresponde al valor de la dirección en la memoria, cuando se pasa, en realidad es el valor de la dirección, por lo que no excederá el límite. El segundo método del autor para pasar el objeto de mapa (o HashMap como otros lo llaman) es también el valor de la dirección en la memoria pasada, que es estrictamente lo mismo que pasar la matriz de bytes.

2. El segundo caso: los datos se guardan en el almacenamiento local y luego se extraen de la Actividad de destino.

3. La tercera necesidad de utilizar el método bundle.clear () para borrar el paquete después de obtener los datos;

Bundle bundle = getArguments();
//获取解析结果集
//String strAsModel = bundle.getString("fdModelList");
//获取数据之后要清空bundle,否则数据量大时跳转到其他Activity会报异常
bundle.clear();

Por supuesto, en el proyecto, ya puse fin a Activity para pasar big data a Fragment, y los datos requeridos se obtienen directamente en Fragment.

Supongo que te gusta

Origin blog.csdn.net/beita08/article/details/109237173
Recomendado
Clasificación