作为一款多媒体应用,我在开发中摒弃了粗暴的实现方式,重点关注了代码的健壮性(Robustness)与容错率。
基于责任链思想重构播放逻辑。针对同一首歌曲,系统会依次探测:Raw资源 -> 本地持久化文件 -> 网络流媒体。实现离线免流播放,大幅降低网络开销。
深度处理 MediaPlayer 的异步加载异常。引入 `cancelAutoSkip()` 机制,在用户高频切歌或 Activity 销毁时,严格清空主线程 Handler 回调 (`removeCallbacksAndMessages`),杜绝内存泄漏与状态错乱。
当遇到网络超时或无版权 (403) 歌曲时,APP 不会崩溃或卡死,而是触发延时 Handler 给出 UI 提示并自动跳过播放下一首。同时 `ApiConfig` 子线程静默拉取最新配置,实现接口的热更新兜底。
抛弃基础的 Activity 播放,使用 `Foreground Service` 获取系统级 WakeLock 唤醒锁,防止息屏后 CPU 休眠导致音频卡顿。通过 `MediaSessionCompat` 与 `BroadcastReceiver` 实现系统锁屏与通知栏的双向操控。
不仅实现了基于 `OnScrollListener` 的平滑上拉加载分页,还利用 `ItemTouchHelper` 实现了物理级的长按拖拽排序和滑动删除,并同步更新底层 `SharedPreferences` 存储数据,保持视图与数据分离。
基于 OkHttp 独立封装子线程大文件下载器,利用 `InputStream` 分块读取音频字节流并写入沙盒目录。通过 `runOnUiThread` 实时回调下载进度,保证主线程绝对流畅。
应用主界面
歌单详情
拖拽排序和滑动删除
通知栏常驻控制 (Service)