在android应用中,有些情况下需要传递一些数据,穿越活动/碎片,传递给服务等。它一直在使用可打包工具并放入意图/捆绑包中。它可以正常工作,只是在某个时间超过包裹的1兆克限制而崩溃。
android.os.TransactionTooLargeException: data parcel size 526576 bytes
试图查看是否可以将可包裹对象的内容放入lruCache中,因此基本上用自己使用lruCache的实现来代替可包裹对象的保存/加载。
这种方法有什么问题吗?或解决此问题的任何建议/替代方案?
@ApiSerializable
class DataItem (
@SerializedName("uuid")
var uuid: String = "",
@SerializedName("image")
val mainImage: Image?, //another parcelable type
@SerializedName("entities")
var entities: List<EntityInfo>?,
//......
// a lot of data
//......
//......
) : BaseDataItem(), IData {
override fun uuid(): String {
return uuid
}
//......
constructor(parcel: Parcel) : this(
parcel.readString(), //uuid
//...
//...
parcel.readParcelable(Image::class.java.classLoader),
mutableListOf<EntityInfo>().apply {
parcel.readTypedList(this, EntityInfo.CREATOR)
}) {
}
override fun writeToParcel(parcel: Parcel, flags: Int) {
parcel.writeString(uuid ?: "")
//......
//......
parcel.writeParcelable(mainImage, flags)
parcel.writeTypedList(entities)
}
override fun describeContents(): Int {
return 0
}
companion object CREATOR : Parcelable.Creator<DataItem> {
override fun createFromParcel(parcel: Parcel): DataItem {
return DataItem(parcel)
}
override fun newArray(size: Int): Array<DataItem?> {
return arrayOfNulls(size)
}
}
}
方法是使用lruCache本身来替换宗地部分的保存/加载:
// having the cache somewhere
val dataCache = LruCache<String, IData>(200)
只有一个字符串成员与包裹一起保存/加载:
fun init (copyData: DataItem) {
// do sopy over from the copyData
}
constructor(parcel: Parcel) : this() {
uuid = parcel.readString(), //uuid
val _thisCopy = dataCache.get(uuid)
init(_thisCopy)
}
override fun writeToParcel(parcel: Parcel, flags: Int) {
parcel.writeString(uuid ?: "")
dataCache.put(uuid, this)
}
答案 0 :(得分:0)
您应该避免将具有大量数据的整个对象传递给您的Next活动。因此,您的对象可能包含许多数据。因此,有时系统无法一次处理大量数据。尝试使用“首选项”存储您的对象数据,并在其他活动中检索它们。
请在这里回答我: Exception when starting activity android.os.TransactionTooLargeException: data parcel size