哆啦A梦小短腿

企业级协同办公 Android 客户端架构复盘

这篇是对近一年在一款企业级 IM / 协同办公 Android 客户端上做的几项架构改造的系统复盘。产品形态可以概括为「IM 即时通讯 + 音视频会议 + 组织架构 + 轻量办公套件(日历 / 文档 / 邮箱 / 待办)」,代码按「应用宿主层 → 业务插件层 → 通用组件层 → 基础能力层」分层,采用 Kotlin + Jetpack Compose + MVI。 下面每个专题都按「背景与...

基于 Media3 的视频缓存与完整文件导出实践

在视频播放场景里,我们经常会遇到两类需求:一类是播放时尽量复用本地缓存,减少重复网络请求;另一类是当缓存已经足够完整时,将缓存内容导出成一个完整的视频文件,供离线使用或后续处理。 Media3 已经提供了缓存、下载、播放器接入等基础能力,但“把缓存导出为一个完整文件”这件事,仍然需要业务层做一次封装。本文结合一套可落地的实践方案,系统梳理以下两个问题: 如何用 Media3 配置视...

UiState设计

MVI 架构模式中的 UiState 设计:单一、嵌套与 `sealed class` 的应用

在 MVI (Model-View-Intent) 架构模式中,UiState 是核心概念之一,它代表了用户界面在任何给定时刻的完整且不可变的状态。理解如何有效设计 UiState 对于构建清晰、可预测且易于维护的应用至关重要。 1. MVI 中 ViewModel 的 UiState:单一性与最佳实践 在 MVI 架构中,推荐每个屏幕(或功能模块)只对应一个 ViewModel,并...

StateFlow和Channel

StateFlow 和 Channel 详解

在 Kotlin 协程中,StateFlow 和 Channel 都是用于异步数据流和通信的强大工具,但它们的设计理念和适用场景有显著区别。理解这些区别对于选择正确的工具至关重要。 StateFlow 详解 StateFlow 是一种热流(Hot Flow),它代表一个可观察的、单一的、可更新的状态。它始终持有一个当前值,并且会将这个最新值立即发送给新的订阅者。 核心特性: ...