该应用是一个短视频列表,用户可上下滑动切换视频播放。系统会根据网络状况自动调整播放质量,WiFi 环境下播放高清,非 WiFi 环境下播放标准清晰度。
每个视频项包含封面图,加载时显示 loading 动画,播放后封面图与动画自动隐藏。采用 ViewPager2 实现流畅分页,并利用 ExoPlayer或者TXVodPlayer 进行预加载与缓存,确保视频快速响应与流畅播放。同时,结合 RecyclerView 的缓存机制 进行播放器优化,限制最多使用 3 个播放器,在节省内存的同时保证高效流畅的播放与滑动体验。
该项目遵循 Clean Architecture 原则,并采用 MVVM(Model-View-ViewModel)架构模式,结合 Multi-Module 项目结构,旨在实现更高水平的模块化和关注点分离。通过将业务逻辑、数据逻辑与 UI 逻辑解耦,确保每个模块职责清晰,从而提高了项目的可维护性、可扩展性和可测试性。数据逻辑通过集中管理,进一步简化了数据处理和存储的复杂度,确保了数据的一致性和可靠性。该架构使得开发、测试更加高效,并且便于后期维护和功能扩展。
- :app - 主 Android 应用模块,壳工程,管理各个子业务模块。
- :feature:videolist - 短视频列表相关业务模块。
- :libs:common - 提供应用中常用的工具类和公共类。
- Clean Architecture: 实现了“清洁”架构,提供更好的关注点分离,提高了代码的可维护性和可测试性。
- Multi-Module:将代码库划分为更小、可重用且可测试的模块,提高可扩展性,减少依赖,并简化大型项目的管理和维护。
- MVVM: 实现了 MVVM 架构模式,将视图逻辑与业务逻辑分离。
- Flow & ViewModel: 用于以生命周期感知的方式管理 UI 相关数据。
- Hilt: Hilt用于实现ViewModel、Repository的依赖注入。
- Moshi: 用于解析 JSON 数据,提高了数据序列化和反序列化的效率。
- Coil: 用于图像加载,提供平滑的图像处理和缓存功能。
- LiteAVSDK_UGC: 使用TXVodPlayer实现视频播放、缓存、预加载等功能。
- Androidx Media3: 使用Androidx Media3的ExoPlayer实现视频播放、缓存、预加载等功能。
-
ViewPager2 实现流畅的滑动切换
使用 ViewPager2 实现视频列表的流畅上下滑动切换效果,确保用户体验平滑。 -
最多实例化 3 个播放器,优化性能体验
为了提高性能和节省资源,限制最多同时实例化 3 个播放器,避免内存泄漏和不必要的播放器实例创建。 -
播放位置记录与恢复
在用户切换视频时,记录每个视频的播放位置,确保在用户切换回该视频时恢复上次播放的位置,提升用户体验。 -
合理使用 RecyclerView.Adapter 特性
利用 RecyclerView.Adapter 的特性巧妙地处理视频切换、播放、记录播放位置、合理复用播放器和释放播放器。通过精确管理 RecyclerView 中的每一项,确保播放器资源的高效利用,避免播放器的过多实例化和内存浪费。 -
架构简介
项目采用 Clean Architecture 和 MVVM 架构模式,并结合 Multi-Module 设计,实现高内聚、低耦合。ViewModel 负责 UI 数据管理,Repository 处理数据操作,确保数据层与 UI 层解耦。良好的架构和模块化设计不仅提升了代码的可维护性和可测试性,还增强了扩展性,使项目在长期迭代中保持稳定和高效。 -
代码规范与注释
代码遵循清晰、可读性强的规范,关键逻辑部分均附有详细注释,确保易于理解和维护。
- 视频列表展示:
- 使用合适的组件实现上下滑动切换视频。✅
- 每个视频项占满屏幕高度,滑动时应具有流畅的分页效果。✅
- 视频播放:
- 实现 HLS 流媒体播放。✅
- 根据网络状况动态选择播放地址:
- 网络良好时使用 mediaUrlHd。✅
- 网络较差时使用 mediaUrl。✅
- 滑动到新视频时,立即停止前一个视频并播放当前视频。✅
- 封面图处理:
- 在视频未播放或加载时显示 coverUrl 对应的封面图。✅
- 视频开始播放后隐藏封面图。✅
- 性能优化:
- 确保滑动时无卡顿,视频切换响应时间尽量短。✅
- 合理管理播放器资源,避免内存泄漏或过多实例创建。✅
- 用户体验:
- 支持基本的播放控制(例如播放、暂停)。✅
- 可选:实现视频预加载,提升切换时的流畅度。✅
- 语言:Kotlin(推荐)或 Java。(Kotlin✅)
- 代码结构:
- 提供清晰的代码分层(例如数据模型、Adapter、Activity/Fragment)。✅
- 使用合适的命名规范和注释。✅
- 完整性:
- 包含布局文件、数据模型和播放逻辑。✅
- 处理生命周期,确保资源在适当时候释放。✅
- 可测试性:
- 代码应能在模拟器或真机上运行,播放 Mock 数据中的视频。✅
欢迎对这个项目提出建议和贡献!请创建一个 Pull Request 或提交问题。
版权所有 (c) [2025] [Andy]
特此免费授予使用、复制、修改、合并、发布、分发、再许可和/或出售本软件的副本,以及允许他人这样做的权限,但须遵守以下条件:
上述版权声明和本许可声明应包含在本软件的所有副本或重要部分中。
本软件按“原样”提供,不附任何明示或暗示的担保,包括但不限于适销性、特定用途的适用性和非侵权的担保。在任何情况下,作者或版权持有者均不对因使用本软件或与本软件有关的行为所引起的任何索赔、损害或其他责任负责。