【问题标题】:Share single instance of class between activities in android app?在android应用程序中的活动之间共享类的单个实例?
【发布时间】:2020-01-04 21:23:18
【问题描述】:

我正在 Android Studio 中创建一个 Android 应用程序,我正在使用 Java 进行编码。

我的应用将有一个类来处理与 SQLite 数据库的连接,它还将有一个抽象化数据库访问的类,即朋友列表以及按朋友排序的发送和接收消息列表。

我目前有三个活动,主要活动,一个用于列出所有朋友的列表,一个用于显示特定的聊天对话。

我的问题是在我的活动之间共享一个类的实例的最佳实践是什么,即数据库类和其他类(比如朋友管理器)。我不想为每个活动复制这些类,而是在我的应用程序的整个生命周期中保留一个实例。

一个例子是“FriendManager”类,它具有提供朋友列表、删除和添加新朋友等的接口。我想在创建所有朋友列表时使用它,也想在创建所有朋友列表时使用它显示一个对话,因为它将包含对“MessageManager”类的引用,该类负责从数据库(和远程位置)加载消息。

【问题讨论】:

  • 您的管理器类似乎符合 Google 的架构模式所称的“存储库”。设置这些的典型解决方案是使用依赖反转框架。对于 Java,默认的依赖倒置选择往往是 Dagger 2,尽管这带来了显着的学习曲线。
  • 我会把它们扔进Service,然后绑定到每个Activity中的Service

标签: java android class android-activity


【解决方案1】:

一种方法是使用单例模式,如https://www.androiddesignpatterns.com/2012/05/correctly-managing-your-sqlite-database.html 中的模式 1 所示

虽然 Google 的最佳做法不是直接使用 SQLite,而是通过数据库室使用 https://developer.android.com/training/data-storage/room/index.html

他们仍然说

如果您的应用在单个进程中运行,则在实例化 AppDatabase 对象时应遵循单例设计模式。每个 RoomDatabase 实例都相当昂贵,您很少需要在单个进程中访问多个实例。

然后在他们的示例中以与 Singleton Pattern 相同的方式实现它 如https://codelabs.developers.google.com/codelabs/android-room-with-a-view/#6中所见@

【讨论】:

  • 谢谢!对我来说,单例模式似乎是最吸引人的。我可以为我的其他不直接处理数据库的类实现类似的东西吗?
  • 我没有尝试过,但我相信它是一个通用模式,应该适用于其他类(它似乎是一个通用 Java 模式codesjava.com/java-singleton-design-pattern
  • 我会将此标记为已回答,但如果有人有其他意见,我很想听听。特别是关于单例模式,因为这是我听说过但从未应用过的东西。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-05
  • 1970-01-01
  • 2012-02-11
  • 1970-01-01
  • 2013-04-12
相关资源
最近更新 更多