What to do on TransactionTooLargeException

前端 未结 30 3750
盖世英雄少女心
盖世英雄少女心 2020-11-22 03:08

I got a TransactionTooLargeException. Not reproducible. In the docs it says

The Binder transaction failed because it was too large.

D

30条回答
  •  刺人心
    刺人心 (楼主)
    2020-11-22 03:47

    For those who bitterly disappointed in search of answer of why the TransactionTooLargeException apears, try to check how much information you save in instance state.

    On compile/targetSdkVersion <= 23 we have only internal warning about large size of saved state, but nothing is crashed:

    E/ActivityThread: App sent too much data in instance state, so it was ignored
        android.os.TransactionTooLargeException: data parcel size 713856 bytes
        at android.os.BinderProxy.transactNative(Native Method)
        at android.os.BinderProxy.transact(Binder.java:615)
        at android.app.ActivityManagerProxy.activityStopped(ActivityManagerNative.java:3604)
        at android.app.ActivityThread$StopInfo.run(ActivityThread.java:3729)
        at android.os.Handler.handleCallback(Handler.java:751)
        at android.os.Handler.dispatchMessage(Handler.java:95)
        at android.os.Looper.loop(Looper.java:154)
        at android.app.ActivityThread.main(ActivityThread.java:6044)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:865)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755)
    

    But on compile/targetSdkVersion >= 24 we have real RuntimeException crash in this case:

    java.lang.RuntimeException: android.os.TransactionTooLargeException: data parcel size 713860 bytes
        at android.app.ActivityThread$StopInfo.run(ActivityThread.java:3737)
        at android.os.Handler.handleCallback(Handler.java:751)
        at android.os.Handler.dispatchMessage(Handler.java:95)
        at android.os.Looper.loop(Looper.java:154)
        at android.app.ActivityThread.main(ActivityThread.java:6044)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:865)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755)
     Caused by: android.os.TransactionTooLargeException: data parcel size 713860 bytes
       at android.os.BinderProxy.transactNative(Native Method)
       at android.os.BinderProxy.transact(Binder.java:615)
       at android.app.ActivityManagerProxy.activityStopped(ActivityManagerNative.java:3604)
       at android.app.ActivityThread$StopInfo.run(ActivityThread.java:3729)
       at android.os.Handler.handleCallback(Handler.java:751) 
       at android.os.Handler.dispatchMessage(Handler.java:95) 
       at android.os.Looper.loop(Looper.java:154) 
       at android.app.ActivityThread.main(ActivityThread.java:6044) 
       at java.lang.reflect.Method.invoke(Native Method) 
       at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:865) 
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755) 
    

    What to do?

    Save data in local database and keep only id's in instance state which you can use to retrieve this data.

提交回复
热议问题