【问题标题】:Data Transfer betwen activities. Kotlin Singleton with Parameters? Other questions活动之间的数据传输。带参数的 Kotlin Singleton?其他问题
【发布时间】:2020-03-04 21:12:32
【问题描述】:

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

ViewModel 有利于 Fragment 之间的数据传输,但似乎不太适合 Activity 之间的数据传输,因为 ViewModel 的生命周期仅限于单个 Activity 的生命周期。

问题 1:是否可以让整个应用程序 - 而不是单个 Activity- ViewModelStoreOwner ?如果是怎么办?你会推荐一个 ViewModelSingleton 吗?

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

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

问题 4: 也可以使用 sharedPreferences 传递数据,但似乎速度较慢。除了到目前为止提到的方法之外,您还有什么快速、稳健和灵活的建议吗?

谢谢。

【问题讨论】:

    标签: android kotlin singleton viewmodel


    【解决方案1】:

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

    您的单例模型可以是传统的单例,也可以是带有您必须调用的初始化函数的object。那只是偏好。只有与单例一起使用的 ViewModel 必须访问它,因此样板文件的使用可能与这两种方式大致相同。

    有时,Android 中的单例需要上下文,例如您要保存到文件或数据库中。在这种情况下,应用程序应该用于 Context,因此您不会意外地将 Activity 传递到 View/ViewModel 屏障并泄漏它。您可以使用 AndroidViewModel,这样您的 ViewModel 将拥有一个可用于检索单例的 Application 实例。

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

    【讨论】:

    • 谢谢。数据存储在 sharedPreferences 中,我只想在每次启动时提取一次。因此,用来自 sharedPreferences 的数据初始化单例对我来说看起来很方便。但是调用getSharedPreferences需要上下文。如果你说这只是一种偏好,考虑到灵活性,我觉得传统的单例 classobject 更舒服。
    • 我会在你的传统 ViewModel 中使用共享首选项。 SharedPreferences 对象你的模型,它已经是一个单例。 SharedPreferences 只有在您第一次在应用程序启动时读取它时才会变慢。然后它将数据保存在内存中。 stackoverflow.com/a/19148351/506796 如果你使用edit.apply() 而不是edit.commit(),那么修改它也很快。
    • 这是我最初的方法。所以你说,当一个新的活动启动时,ViewModel 将从内存中调用 sharedPreferences 数据,而不是从磁盘中调用。由于这是一个快速的过程,如果在每个活动中都实例化一个新的 ViewModel 对象,这不是什么大问题。我猜对了吗?
    • 是的,我就是这么说的。
    • 问题是数据对象存储为 JSON。因此,对于每个新的 ViewModel 对象,最多会进行 200 次 JSON 到类的转换。你认为这是一个很大的问题吗?也许保持解码对象的单身人士会更好。 ?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-10
    • 2018-03-25
    • 1970-01-01
    相关资源
    最近更新 更多