android 为什么我有多个“Player”示例?

7eumitmz  于 2023-11-15  发布在  Android
关注(0)|答案(1)|浏览(105)

我正在开发一个Android应用程序,有一个音乐播放器的功能。一切都工作,因为它应该是现在,但我不满意我这样做,所以我在这里。
该应用程序是100%Kotlin100%组成。我使用NavHost在可组合屏幕之间导航。

主活动包含NavHost。NavHost包含每个屏幕的所有导航和组合
每个屏幕(好吧,不是每一个,但大多数)我使用的是一个PlayerScaffold,它传递了一个顶部栏和一个内容,它们通常组成屏幕,但添加和更新了一个底部迷你播放器(一个la Spotify)和一个全屏模式播放器,向上滑动。
每个内容屏幕都有自己的视图模型,迷你播放器和完整播放器都有一个PlayerViewModel。
PlayerViewModel传递了一个“Player”的示例,它是一个包含exoplayer示例并执行所有播放操作的类。
Player类由Dagger Hilt示例化并在模块中定义:

@Module
@InstallIn(SingletonComponent::class)
abstract class PlayerModule {

    @Binds
    abstract fun bindPlayer(
        playerImpl: PlayerImpl,
    ): Player
}

字符串
最重要的是,我有一个前台服务“PlayerService”来保存“Player”示例,以便当应用程序进入后台时,它可以保存对播放器的引用,并且不会被杀死。
我遇到的问题(现在已经解决了)是,PlayerViewModel和Player的几个示例正在创建,因此如果我在一个屏幕上开始播放一首歌,然后转到下一个屏幕,下一个屏幕中的播放器将无法正确更新。我通过在Application类中保存PlayerViewModel的示例来解决这个问题,所以只有一个示例被创建,但我非常不确定这种方法。
我期望它的工作方式是每个合成屏幕都有一个PlayerViewModel的示例,但是Player的示例对于所有ViewModel都是相同的。
如果Player类被注解为“Singleton”,为什么我会有多个示例?

h9vpoimq

h9vpoimq1#

我弄明白了,这里的问题是在PlayerModule类中,我将其注解为

@InstallIn(SingletonComponent::class)

字符串
我没有阅读文档,我认为这意味着它会自动使模块中的所有内容都成为“单例”。
在函数中添加@Singleton解决了这个问题。不需要在任何地方保存视图模型的示例,现在它可以像预期的那样工作。

@Module
@InstallIn(SingletonComponent::class)
abstract class PlayerModule {

    @Singleton
    @Binds
    abstract fun bindPlayer(
        playerImpl: PlayerImpl,
    ): Player
}

相关问题