20

Is there any way to know the bundle size in bytes? My point in asking this is I am saving parcelable object lists in my bundle on onSaveInstanceState.

I need to check if the bundle size is reached it's size limit and prevent any more data to get saved, and to prevent TransactionTooLarge exception to occur.

Ayush Khare
  • 1,802
  • 1
  • 15
  • 26

3 Answers3

20

I think easiest way for me is:

fun getBundleSizeInBytes(bundle : Bundle) : Int {
  val parcel = Parcel.obtain()
  parcel.writeValue(bundle)

  val bytes = parcel.marshall()
  parcel.recycle()

  return bytes.size
}
Martynas Jurkus
  • 9,231
  • 13
  • 59
  • 101
12

Parcel class has dataSize() member, so the same result can be achieved without calling marshall():

int getBundleSizeInBytes(Bundle bundle) {
    Parcel parcel = Parcel.obtain();
    int size;

    parcel.writeBundle(bundle);
    size = parcel.dataSize();
    parcel.recycle();

    return size;
}
2

Here's the same method provided by @Volodymyr Kononenko using Kotlin's extension function for those interested:

fun Bundle.bundleSizeInBytes(): Int {
    val parcel = Parcel.obtain()
    parcel.writeBundle(this)

    val size = parcel.dataSize()
    parcel.recycle()

    return size
}

In case you want the Bundle's size in Kilobytes instead of bytes

fun Bundle.bundleSizeInKilobytes(): Double {
    val parcel = Parcel.obtain()
    parcel.writeBundle(this)

    val size = parcel.dataSize().toDouble()/1000
    parcel.recycle()

    return size
}

BTW I wouldn't use writeValue() instead of writeBundle() as writeValue() adds extra 4 bytes to the size.

M.Ed
  • 969
  • 10
  • 12