【发布时间】:2018-01-01 06:10:09
【问题描述】:
有什么方法可以知道捆绑包的大小(以字节为单位)吗? 我要问这个问题的目的是,我将可打包对象列表保存在 onSaveInstanceState 上的 bundle 中。
我需要检查捆绑包的大小是否已达到其大小限制并防止保存更多数据,并防止发生TransactionTooLarge 异常。
【问题讨论】:
-
你能编辑问题并向我们解释为什么下面的答案不适合你吗?
有什么方法可以知道捆绑包的大小(以字节为单位)吗? 我要问这个问题的目的是,我将可打包对象列表保存在 onSaveInstanceState 上的 bundle 中。
我需要检查捆绑包的大小是否已达到其大小限制并防止保存更多数据,并防止发生TransactionTooLarge 异常。
【问题讨论】:
我认为对我来说最简单的方法是:
fun getBundleSizeInBytes(bundle : Bundle) : Int {
val parcel = Parcel.obtain()
parcel.writeValue(bundle)
val bytes = parcel.marshall()
parcel.recycle()
return bytes.size
}
【讨论】:
Parcel 类有 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 个字节的大小。
【讨论】: