Android 活动之间的数据传输。带参数的Kotlin Singleton?其他问题

Android 活动之间的数据传输。带参数的Kotlin Singleton?其他问题,android,kotlin,singleton,viewmodel,Android,Kotlin,Singleton,Viewmodel,一个包含5-200个对象(取决于应用程序用户)的列表/集合,其中包含5个40个字符的字符串变量,需要在活动之间共用 ViewModels适用于片段之间的数据传输,但似乎不适用于活动之间的数据传输,因为ViewModel的生命周期仅限于单个活动的生命周期 问题1:是否可以使整个应用程序而不是单个活动成为ViewModelStoreOwner?如果是,怎么做?你能推荐一个ViewModelSingleton吗 问题2:换成普通的单例怎么样?与ViewModel和ViewModelSingleton相

一个包含5-200个对象(取决于应用程序用户)的列表/集合,其中包含5个40个字符的
字符串
变量,需要在活动之间共用

ViewModels适用于片段之间的数据传输,但似乎不适用于活动之间的数据传输,因为ViewModel的生命周期仅限于单个活动的生命周期

问题1:是否可以使整个应用程序而不是单个活动成为ViewModelStoreOwner?如果是,怎么做?你能推荐一个ViewModelSingleton吗

问题2:换成普通的单例怎么样?与ViewModel和ViewModelSingleton相比,优缺点是什么?是否有可能将一个单例发送到垃圾收集器并丢失数据

问题3:Kotlin中的
对象
定义了一个线程安全的、延迟实例化的单例,这非常棒,但不可能直接传入参数。传入参数有多种方法。你建议什么方法?为什么

问题4:使用SharedReference传递数据也是可能的,但速度似乎较慢。除了目前提到的方法之外,您还有什么其他快速、可靠和灵活的方法可以推荐吗


谢谢。

如果您的数据与您的数据一样小,在整个应用程序中使用,那么singleton对我来说是有意义的。但不是“ViewModel”单例。您的模型类应该是singleton,而不是ViewModel,它包含处理模型数据的逻辑,并且应该限定到某个活动(以及为每个活动创建的新实例)的范围

您的单例模型可以是传统的单例模型,也可以是带有必须调用的初始化函数的
对象。那只是偏好。只有与singleton一起工作的ViewModel才必须访问它,因此无论哪种方式,样板文件的使用都可能大致相同

有时候,Android中的单身汉需要一个上下文,比如如果你要保存到文件或数据库中。在这种情况下,应用程序应该用于上下文,这样您就不会意外地通过视图/视图模型屏障传递活动并泄漏它。您可以使用AndroidViewModel,这样您的ViewModel将有一个应用程序实例,可用于检索单例


SharedReferences也可以工作,并且通常不会很慢,因为它将数据保存在内存中,并将其保存到后台的文件中。但是,您正在进行不必要的文件写入。

谢谢。数据存储在SharedReferences中,我只想在每次启动时提取一次。因此,使用来自SharedReferences的数据初始化singleton对我来说似乎很方便。但是调用
getSharedReferences
需要上下文。如果你说这只是一个偏好,考虑到灵活性,我觉得使用传统的单例
比使用
对象
更合适。那么我只会在传统的ViewModel中使用共享偏好。SharedReferences对象是您的模型,它已经是一个单例。SharedReferences仅在应用程序启动时第一次读取时才会变慢。然后它将数据保存在内存中。如果您使用
edit.apply()
而不是
edit.commit()
,那么修改它也很快。这是我最初的方法。也就是说,当一个新活动启动时,ViewModel将从内存调用SharedReferences数据,而不是从磁盘调用。因为这是一个快速的过程,所以如果在每个活动中实例化一个新的ViewModel对象,这不是一个大问题。我明白了吗?是的,我就是这么说的。问题是数据对象存储为JSON。因此,对于每个新的ViewModel对象,最多可以进行200次JSON到类的转换。你认为这是个大问题吗?也许用一个单身汉来保存解码的对象会更好?