mapbox-maps-android icon indicating copy to clipboard operation
mapbox-maps-android copied to clipboard

rememberGeoJsonSourceState causes transaction too large exception when saving state

Open jacobtabak opened this issue 1 year ago • 2 comments

Environment

  • Android OS version: any
  • Devices affected: any
  • Maps SDK Version: 11.6.0

Observed behavior and steps to reproduce

  • Remember a lot of complicated geometry using rememberGeoJsonSourceState
  • Pause the app by backgrounding it
  • Experience TransacationTooLarge crash when compose tries to persist the geometry into a bundle

We are loading some pretty complex geometry (testing with 1175 features) and following the examples, I tried using rememberGeoJsonSourceState in compose. However, under the hood, this function uses rememberSaveable which tries to persist all of those features to a bundle to save their state when the activity is paused. This of course causes a crash for our use case which was a bit tricky to debug because it was not immediately clear why the bundle was so large until we dug into the code.

Would it be reasonable to suggest making separate functions for rememberGeoJsonSourceState and rememberGeoJsonSourceStateSaveable? For our use case we just implemented a non-saveable version.

Expected behavior

Don't crash when saving state

Notes / preliminary analysis

Additional links and references

                                         java.lang.RuntimeException: android.os.TransactionTooLargeException: data parcel size 687388 bytes
                                         	at android.app.ActivityClient.activityStopped(ActivityClient.java:87)
                                         	at android.app.servertransaction.PendingTransactionActions$StopInfo.run(PendingTransactionActions.java:143)
                                         	at android.os.Handler.handleCallback(Handler.java:938)
                                         	at android.os.Handler.dispatchMessage(Handler.java:99)
                                         	at android.os.Looper.loopOnce(Looper.java:201)
                                         	at android.os.Looper.loop(Looper.java:288)
                                         	at android.app.ActivityThread.main(ActivityThread.java:7870)
                                         	at java.lang.reflect.Method.invoke(Native Method)
                                         	at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548)
                                         	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1003)
                                         Caused by: android.os.TransactionTooLargeException: data parcel size 687388 bytes
                                         	at android.os.BinderProxy.transactNative(Native Method)
                                         	at android.os.BinderProxy.transact(BinderProxy.java:571)
                                         	at android.app.IActivityClientController$Stub$Proxy.activityStopped(IActivityClientController.java:1315)
                                         	at android.app.ActivityClient.activityStopped(ActivityClient.java:84)
                                         	at android.app.servertransaction.PendingTransactionActions$StopInfo.run(PendingTransactionActions.java:143) 
                                         	at android.os.Handler.handleCallback(Handler.java:938) 
                                         	at android.os.Handler.dispatchMessage(Handler.java:99) 
                                         	at android.os.Looper.loopOnce(Looper.java:201) 
                                         	at android.os.Looper.loop(Looper.java:288) 
                                         	at android.app.ActivityThread.main(ActivityThread.java:7870) 
                                         	at java.lang.reflect.Method.invoke(Native Method) 
                                         	at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548) 
                                         	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1003) 

jacobtabak avatar Aug 22 '24 22:08 jacobtabak

@jacobtabak although this is a valid issue and we'll try to think what could be improved here, please keep in mind that we recommend using your own remember when working with large amounts of data. Can you try this out?

kiryldz avatar Aug 27 '24 12:08 kiryldz

I just ran into the same issue. It looks like I should be able to use remember to fix this. But it would be much better if rememberGeoJsonSourceState() trap didn't exist in the first place. Alternatively, the docs, samples and examples pointing out this tricky situation in large red font can help too. It's way too easy to miss the line in docs mentioning the problem.

igokoro avatar Sep 02 '25 16:09 igokoro

No news? We’ve just migrated to Mapbox v11 and have just encountered this issue in production. It’s unfortunate that this is only mentioned as a small note in the documentation.

ravenfeld avatar Jan 06 '26 11:01 ravenfeld