Передача больших данных между действиями в Kotlin - PullRequest
1 голос
/ 12 февраля 2020

Я пытаюсь передать большие данные из одного действия в другое. По деловым причинам я не могу сохранить эти данные в постоянном хранилище, и мне нужно, чтобы они оставались в памяти.

До сих пор я использовал Intents для передачи Serializable данных, но с большими данными я TranstactionTooLarge

Какие у меня варианты? Я использую Kotlin, так что Kotlin -specifi c решения приветствуются.

Я думал об использовании Singletons, но я не уверен в побочных эффектах этого, или если есть лучшее решение.

Ответы [ 2 ]

2 голосов
/ 12 февраля 2020

Вы можете использовать одноэлементный объект и хранить в нем свои данные. Намеренно, вы можете передать какой-то ключ (Int или, возможно, String), чтобы получить ваши данные из синглтона в активности получателя.

Также существуют реализации шаблона шины событий, которые применимы по той же причине.

1 голос
/ 12 февраля 2020

TransactionTooLargeexception отражает ограничения механизма IP C для Android в том, как данные передаются между процессами.

Поскольку вы обмениваетесь данными между действиями с учетом имеющихся у вас ограничений, мне в голову пришли следующие возможности:

  1. хранение данных в единственном экземпляре репозитория (который требует ответственности за перезагрузку данные в случае, если они теряются во время воссоздания действий и т. д. c.) и передачи только уникальных неопределителей (или идентификаторов)
  2. уменьшают размер данных путем простого преобразования или сжатия данных (целое число вместо числа с плавающей запятой, долго для Date et c.)
  3. , как отмечает @nsk, с шиной событий вы можете преодолеть ограничения IP C, но это приносит "удовольствие" с жизненным циклом деятельности
  4. kotlin привносит в игру kotlinx.serialization, с моей стороны не так много опыта, но вы наверняка сможете что-то оценить (производительность и объем данных)

Независимо от выбранного решения вашей проблемы, я бы рекомендовал использовать Parcelable вместо Seriazable для Intent, в основном из соображений производительности, рефлексия все еще остается проблемой, и я едва могу вспомнить Mber, имеющий предупреждения Lint. Для Parcelable с Kotlin действительно есть удобное решение с аннотацией Parcelize, предоставляемой Kotlin Android Extensions library.

Простой объект выглядит так

@Parcelize
class Student(val name: String, val year: Int) : Parcelable
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...