以字节为单位的包大小

Bundle size in bytes

有什么方法可以知道包大小(以字节为单位)?我问这个的意思是我在 bundle [=11] 中保存可打包对象列表=].

我需要检查包大小是否达到其大小限制并防止保存更多数据,并防止发生 TransactionTooLarge 异常。

我认为对我来说最简单的方法是:

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

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

  return bytes.size
}

Parcel class 有 dataSize() 成员,所以不用调用 marshall() 也能得到同样的结果:

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

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

    return size;
}

这是@Volodymyr Kononenko 使用 Kotlin 扩展函数为感兴趣的人提供的相同方法:

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

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

    return size
}

如果您希望 Bundle 的大小以千字节而不是字节为单位

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

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

    return size
}

顺便说一句,我不会使用 writeValue() 而不是 writeBundle(),因为 writeValue() 会额外增加 4 个字节的大小。