Android - TransactionTooLargeException: data parcel size bytes
Při vývoji aplikací v Android studiu se můžeme setkat s chybou java.lang.RuntimeException: android.os.TransactionTooLargeException: data parcel size bytes.
Problém vzniká kvůli přetečení maximální velikosti Bundle - Binder transaction, která přesáhne 1MB.
Celá chyba
D/AndroidRuntime: Shutting down VM
E/AndroidRuntime: FATAL EXCEPTION: main
Process: cz.up4.polymorph_crud, PID: 20172
java.lang.RuntimeException: android.os.TransactionTooLargeException: data parcel size 928068 bytes
at android.app.ActivityThread$StopInfo.run(ActivityThread.java:3950)
at android.os.Handler.handleCallback(Handler.java:790)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6494)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)
Caused by: android.os.TransactionTooLargeException: data parcel size 928068 bytes
at android.os.BinderProxy.transactNative(Native Method)
at android.os.BinderProxy.transact(Binder.java:764)
at android.app.IActivityManager$Stub$Proxy.activityStopped(IActivityManager.java:4623)
at android.app.ActivityThread$StopInfo.run(ActivityThread.java:3934)
at android.os.Handler.handleCallback(Handler.java:790)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6494)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)
Řešení
Já se podělím o poněkud primitivní řešení tohoto problému - rozdhodl jsem se jen pro promazávání ARG_RESPONSE v Bundle poté co ji načtu do proměnné a dále s ní nepotřebuji pracovat:
bundle.putString(ARG_RESPONSE, "");
A celý probém se tím vyřešil :-)
Takže to pak vypadá třeba takto:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Bundle bundle = getArguments();
responseData = bundle.getString(ARG_RESPONSE);
// reset to fix error:
// TransactionTooLargeException: data parcel size 928124 bytes
bundle.putString(ARG_RESPONSE, "");
}