В приложении для Android бывают случаи, когда необходимо передать некоторые данные, пересечь активность/фрагмент, перейти к сервису и т. д. Он использует пакет и помещает его в намерение/пакет. Он работает нормально, за исключением того, что иногда происходит сбой при превышении лимита в один мегабайт.
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)
и только один элемент строки сохраняется/загружается вместе с Parcel:
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)
}
LruCache
. Использование кеша как части репозитория вполне разумно, хотя иногда и немного сложно сделать это правильно. - person CommonsWare   schedule 19.04.2019LiveData
и т. д.), испускают измененные объекты, когда они меняются на любых активных подписчиков/наблюдателей. - person CommonsWare   schedule 19.04.2019