【问题标题】:Bundle size in bytes捆绑包大小(以字节为单位)
【发布时间】:2018-01-01 06:10:09
【问题描述】:

有什么方法可以知道捆绑包的大小(以字节为单位)吗? 我要问这个问题的目的是,我将可打包对象列表保存在 onSaveInstanceState 上的 bundle 中。

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

【问题讨论】:

标签: android exception bundle


【解决方案1】:

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

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

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

  return bytes.size
}

【讨论】:

    【解决方案2】:

    Parcel 类有 dataSize() 成员,所以不用调用 marshall() 也能达到同样的效果:

    int getBundleSizeInBytes(Bundle bundle) {
        Parcel parcel = Parcel.obtain();
        int size;
    
        parcel.writeBundle(bundle);
        size = parcel.dataSize();
        parcel.recycle();
    
        return size;
    }
    

    【讨论】:

    • 这是字节数
    【解决方案3】:

    这是@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 个字节的大小。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-05-03
      • 1970-01-01
      • 2011-11-22
      • 2013-02-01
      • 1970-01-01
      • 2014-01-27
      • 2013-04-26
      • 2016-03-19
      相关资源
      最近更新 更多