【问题标题】:Best practices: ExoPlayer that gets passed between activities/fragments/adapters?最佳实践:在活动/片段/适配器之间传递的 ExoPlayer?
【发布时间】:2021-11-30 14:21:56
【问题描述】:

我有一个相当复杂的用例。我不是在寻找具体的代码,而是关于如何最好地处理这种情况的更高级的技术帮助。

这是我希望我的应用运行的方式:

  • 我的应用程序的主页是RecyclerView,其中每个项目都有一个视频。用户向下滚动时,一次只能播放一个视频(第一个完全可见的视频)。
  • 点按 RecyclerView 中的视频会将您带到第二页,我想在此继续播放第一页上中断的视频。
  • 从第二页返回到第一页时,视频应从第二页中断的地方继续播放。
  • 我还有其他几个页面也想播放视频。

根据我的阅读,出于性能原因,听起来我应该只创建一个 ExoPlayer 实例并传递它。

所以我的问题是,在我应该只创建 ExoPlayer 的一个实例,然后能够在活动、片段、适配器等之间传递它的情况下,最好的方法是什么?

我应该创建一个Singleton 来处理所有视频播放器逻辑并根据需要在页面之间传递吗?还是我应该采用不同的方法?

【问题讨论】:

  • ExoPlayer 是一个库,而不是一个类。对于视频播放,您将使用 ExoPlayer 库中的自定义视图,例如 PlayerView。该视图归活动所有,不能在活动之间传递。因此,您需要将 UI 的这个核心部分设计为单个 Activity,对各个屏幕或其他 UI 元素使用 Fragments/composables/whatever。
  • @CommonsWare 我当前的架构是使用具有多个片段的多个活动。迁移到单一活动架构将是一项艰巨的工作。我还有哪些其他选择?
  • 没有,差不多。请注意,我并不是暗示整个应用程序必须是单个活动,只是具有此英雄从滚动列表中的元素过渡到第二页的部分。基本上,必须共享播放视频的所有内容都需要在一个活动中。
  • @CommonsWare 我只想说清楚,以防它不在我的帖子中,这与过渡/动画无关,而是保留 ExoPlayer 的一个实例并传递它(忽略动画)。你提到了“英雄转换”,这让我有点困惑。你的答案还是一样吗?
  • 在单个活动中,是的。这就是我提到英雄转换的原因,因为这听起来很像你从用户体验中追求的目标,即使你不一定需要动画方面。但是你不能在不同的活动之间共享一个PlayerView

标签: android android-videoview exoplayer exoplayer2.x android-video-player


【解决方案1】:

您将有一个选择,而不是创建一个具有所有可能带来的问题的单例,而是实现依赖注入(使用 HILT 更容易,而不是纯 dagger),最后您创建一个exoplayer 对象,但您的活动不依赖于另一个类,而是注入了依赖项。

另外,您可以考虑创建一个小片段来负责播放视频,并将其注入 exoplayer 实例。这样,即使您为所有屏幕多次重新创建此片段,您也只有播放视频一次的逻辑。

【讨论】:

    猜你喜欢
    • 2023-03-30
    • 1970-01-01
    • 1970-01-01
    • 2012-12-24
    • 2019-11-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多