1. 评论列表中的媒体生命周期管理概述
在移动应用开发中,处理包含富媒体(如视频、GIF等)的评论列表是一个常见但颇具挑战性的场景。当用户滚动列表时,我们需要确保:
- 可见项中的媒体能够自动播放
- 滑出屏幕的媒体能够及时暂停
- 页面切换时所有媒体都能正确处理生命周期事件
- View被复用时不会出现资源泄漏或状态错乱
这个问题看似简单,但随着业务复杂度提升(如多层嵌套评论、多种媒体类型混合、曝光统计等需求加入),直接粗暴的管理方式很快就会变得难以维护。本文将基于实际项目经验,深入分析两种典型实现方案的优劣,并给出可落地的优化方案。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 常规实现方式:Adapter直接管理生命周期
2.1 基本实现思路
最直观的做法是让Adapter直接监听Fragment/Activity的生命周期,然后在回调中遍历所有ViewHolder来控制媒体状态。这种方式的典型流程是:
- Fragment在onResume时调用adapter.onHostResume()
- Adapter遍历所有ViewHolder,触发它们的startMediaIfVisible()
- Fragment在onPause时调用adapter.onHostPause()
- Adapter再次遍历所有ViewHolder,统一调用stopMedia()
这种实现的核心特点是:集中式管理。所有媒体控制逻辑都汇聚在Adapter中,ViewHolder只需要暴露简单的控制接口。
2.2 典型代码实现
Fragment部分
java复制public class CommentFragment extends Fragment {
private CommentAdapter adapter;
@Override
public void onResume() {
super.onResume();
adapter.onHostResume(); // 触发所有媒体恢复
}
@Override
public void onPause() {
adapter.onHostPause(); // 暂停所有媒体
super.onPause();
}
}
Adapter部分
java复制public class CommentAdapter extends RecyclerView.Adapter<CommentViewHolder> {
private final List<CommentViewHolder> holders = new ArrayList<>();
@Override
public CommentViewHolder onCreateViewHolder(ViewGroup parent, int type) {
CommentViewHolder holder = new CommentViewHolder(...);
holders.add(holder); // 记录所有创建的ViewHolder
return holder;
}
public void onHostResume() {
for (CommentViewHolder holder : holders) {
holder.startMediaIfVisible();
}
}
public void onHostPause() {
for (CommentViewHolder holder : holders) {
holder.stopMedia();
}
}
}
ViewHolder部分
java复制public clas
