Android 在Kotlin中的活动之间传递大数据

Android 在Kotlin中的活动之间传递大数据,android,kotlin,Android,Kotlin,我试图将大数据从一个活动传递到另一个活动。出于业务原因,我无法将此数据保存到永久性存储中,需要将其保留在内存中 到目前为止,我一直在使用Intents传递可序列化数据,但对于较大的数据,我一直收到TranstactionSolarge异常/崩溃 我有什么选择?我正在使用Kotlin,因此欢迎使用Kotlin特定的解决方案 我曾想过使用单例对象,但我不确定它的副作用,或者是否有更好的解决方案。您可以使用单例对象并将数据存储在其中。在intent中,您可以传递一些键Int或字符串,以便在receiv

我试图将大数据从一个活动传递到另一个活动。出于业务原因,我无法将此数据保存到永久性存储中,需要将其保留在内存中

到目前为止,我一直在使用Intents传递可序列化数据,但对于较大的数据,我一直收到TranstactionSolarge异常/崩溃

我有什么选择?我正在使用Kotlin,因此欢迎使用Kotlin特定的解决方案


我曾想过使用单例对象,但我不确定它的副作用,或者是否有更好的解决方案。

您可以使用单例对象并将数据存储在其中。在intent中,您可以传递一些键Int或字符串,以便在receiver活动中从singleton获取数据


还有一些事件总线模式的实现,出于同样的原因也适用。

您可以使用singleton对象并在其中存储数据。在intent中,您可以传递一些键Int或字符串,以便在receiver活动中从singleton获取数据

还有一些事件总线模式的实现,出于同样的原因也适用。

反映了Android上IPC机制在进程间数据传输方式上的局限性

由于您在活动之间共享数据,考虑到您的限制,我想到了以下可能性:

将数据保存在存储库的单个实例中,该实例承担重新加载数据的责任,以防在重新创建活动等过程中丢失数据,并仅传输唯一的索引器标识符 通过简单的数据转换或压缩整数(而不是浮点、长日期等)减少数据大小。 正如@nsk所指出的,通过事件总线,您可以克服IPC的限制,但这给活动的生命周期带来了乐趣 kotlin将kotlinx.serialization引入到游戏中,在我这方面没有太多经验,但肯定有一些东西可以评估性能和数据大小 独立于您选择的问题解决方案,我建议出于目的使用Parcelable而不是Seriazable,主要是出于性能原因,反射仍然是一个问题,我几乎不记得有过lint警告。对于Kotlin的Parcelable,Kotlin Android Extensions library提供的Parcelize注释确实是一个方便的解决方案

简单对象如下所示

@Parcelize
class Student(val name: String, val year: Int) : Parcelable
反映了Android上IPC机制在进程间数据传输方式上的局限性

由于您在活动之间共享数据,考虑到您的限制,我想到了以下可能性:

将数据保存在存储库的单个实例中,该实例承担重新加载数据的责任,以防在重新创建活动等过程中丢失数据,并仅传输唯一的索引器标识符 通过简单的数据转换或压缩整数(而不是浮点、长日期等)减少数据大小。 正如@nsk所指出的,通过事件总线,您可以克服IPC的限制,但这给活动的生命周期带来了乐趣 kotlin将kotlinx.serialization引入到游戏中,在我这方面没有太多经验,但肯定有一些东西可以评估性能和数据大小 独立于您选择的问题解决方案,我建议出于目的使用Parcelable而不是Seriazable,主要是出于性能原因,反射仍然是一个问题,我几乎不记得有过lint警告。对于Kotlin的Parcelable,Kotlin Android Extensions library提供的Parcelize注释确实是一个方便的解决方案

简单对象如下所示

@Parcelize
class Student(val name: String, val year: Int) : Parcelable

添加代码可能会帮助其他人。假设此数据用于视图,您可能希望使用共享视图模型进行调查。您可以在此处找到与TransactionTooLarge异常相关的所有问题的答案:-@SatyamKamboj我已经在那里查看过了,没有Kotlin特定的。随机生成加密密钥怎么样,在临时数据库中存储加密数据并将该密钥传递给第二个活动?一旦键离开内存,所有数据都将无法恢复。对于需要处理这些大数据的屏幕,请使用单个活动和多个片段。添加代码可能会对其他人有所帮助。假设此数据用于视图,您可能希望使用共享视图模型进行调查。您可以在此处找到与TransactionTooLarge异常相关的所有问题的答案:-@SatyamKamboj我已经在那里查看过了,没有Kotlin特定的。随机生成加密密钥怎么样,在临时数据库中存储加密数据并将该密钥传递给第二个活动?一旦键离开内存,所有数据都将无法恢复。对于需要处理这些大数据的屏幕,请使用单个活动和多个片段。我想数据大小限制也适用于parcelable,这只是出于性能原因而推荐的序列化方法。我刚才提到了一些可能的想法。解决方案和决策取决于数据类型和应用程序本身。关于活动
es娱乐,例如接听电话、电话轮换、从瞌睡模式启动应用程序、内存不足等,可导致娱乐活动的接收。我想指出这样一个事实,即只要进程存在,数据就一直保存在内存中。公平的说,包裹与解决方案无关,至少不直接相关。所以我以后会更清楚。我也没有一个明确的偏好,它取决于我不知道的数据,我只是试图为数据提供解决方案。根据我的直觉,我更喜欢不移动数据的解决方案。我想数据大小限制同样适用于parcelable,这只是出于性能原因而推荐的序列化方法。我刚才提到了一些可能的想法。解决方案和决策取决于数据类型和应用程序本身。关于娱乐活动,例如接听电话、电话轮换、从瞌睡模式启动应用程序、内存不足等,都会导致娱乐活动的接收。我想指出这样一个事实,即只要进程存在,数据就一直保存在内存中。公平的说,包裹与解决方案无关,至少不直接相关。所以我以后会更清楚。我也没有一个明确的偏好,它取决于我不知道的数据,我只是试图为数据提供解决方案。根据我的直觉,我更喜欢不移动数据的解决方案。Singleton是一个非常糟糕的主意,因为如果应用程序进程死机,您将丢失所有数据,这是可能的,但@user098765告诉我,这是我无法将此数据保存到持久存储并需要将其保留在内存中的唯一选项。我认为Jobscheduler可以绕过此限制。所以,若进程在接收器活动开始之前被终止,系统可以在JobInfo中存储大量数据。但我不确定这种情况下的数据大小限制,这似乎是一个非常笨拙的解决方案,即使它有效。Singleton是一个非常糟糕的主意,因为如果应用程序进程死亡,您将丢失所有数据,这是可能的,但是@user098765告诉我,这是唯一一个选项,我无法将数据保存到持久性存储中,需要它保留在内存中。我认为Jobscheduler可以绕过这个限制。所以,若进程在接收器活动开始之前被终止,系统可以在JobInfo中存储大量数据。但我不确定这种情况下的数据大小限制,这似乎是一个非常笨拙的解决方案,即使它有效。