# 防抖功能使用指南 ## 已创建的防抖工具类 已创建 `DebounceClickListener.java`,位于: ``` android-app/app/src/main/java/com/example/livestreaming/DebounceClickListener.java ``` ## 使用方法 ### 1. 基本用法(默认500ms防抖) **之前的代码:** ```java button.setOnClickListener(v -> { // 处理点击事件 doSomething(); }); ``` **修改后的代码:** ```java button.setOnClickListener(new DebounceClickListener() { @Override public void onDebouncedClick(View v) { // 处理点击事件 doSomething(); } }); ``` ### 2. 自定义防抖时间 ```java button.setOnClickListener(new DebounceClickListener(1000) { // 1秒防抖 @Override public void onDebouncedClick(View v) { doSomething(); } }); ``` ## 已添加防抖的位置 ### WorkDetailActivity.java ✅ - [x] 返回按钮 (backButton) - [x] 操作菜单按钮 (actionButton) - [x] 点赞按钮 (likeButtonContainer) - [x] 收藏按钮 (favoriteButtonContainer) - [x] 评论按钮 (commentButtonContainer) - [x] 描述文本点击 (descriptionText) ## 需要添加防抖的位置 ### 高优先级(用户交互频繁的按钮) #### MainActivity.java - [ ] 菜单按钮 (menuButton) - 第312行 - [ ] 头像按钮 (avatarButton) - 第322行 - [ ] 通知图标 (notificationIcon) - 第335行 - [ ] 添加直播按钮 (fabAddLive) - 第429行 - [ ] 麦克风/搜索图标 (micIcon) - 第505行 - [ ] 创建直播间对话框确认按钮 - 第898行 - [ ] 复制推流地址按钮 (copyAddressBtn) - 第1053行 - [ ] 复制推流密钥按钮 (copyKeyBtn) - 第1058行 #### ConversationActivity.java - [ ] 返回按钮 (backButton) - 第64行 - [ ] 发送按钮 (sendButton) - 第175行 #### EditProfileActivity.java - [ ] 返回按钮 (backButton) - 第106行 - [ ] 取消按钮 (cancelButton) - 第107行 - [ ] 头像行点击 (avatarRow) - 第114行 - [ ] 头像预览点击 (avatarPreview) - 第117行 - [ ] 保存按钮 (saveButton) - 第145行 - [ ] 选择图片按钮 (pick) - 第308行 - [ ] 拍照按钮 (camera) - 第313行 - [ ] 取消按钮 (cancel) - 第321行 - [ ] 性别输入点击 (inputGender) - 第351行 - [ ] 位置输入点击 (inputLocation) - 第366行 - [ ] 位置确认按钮 (confirmButton) - 第438行 - [ ] 位置取消按钮 (cancelButton) - 第444行 - [ ] 生日输入点击 (inputBirthday) - 第466行 - [ ] 生日确认按钮 (confirmButton) - 第547行 - [ ] 生日取消按钮 (cancelButton) - 第572行 #### LoginActivity.java - [ ] 登录按钮 - [ ] 注册跳转按钮 #### RegisterActivity.java - [ ] 注册按钮 - [ ] 返回登录按钮 #### ProfileActivity.java - [ ] 返回按钮 - [ ] 编辑资料按钮 - [ ] 关注/取消关注按钮 - [ ] 作品点击 #### PublishWorkActivity.java - [ ] 返回按钮 - [ ] 选择图片/视频按钮 - [ ] 发布按钮 #### SearchActivity.java - [ ] 返回按钮 - [ ] 搜索按钮 - [ ] 搜索建议项点击 #### SettingsPageActivity.java - [ ] 返回按钮 - [ ] 各个设置项点击 - [ ] 退出登录按钮 ### 中优先级(列表项点击) #### Adapter类 - [ ] ConversationsAdapter - 对话列表项点击 - [ ] ConversationMessagesAdapter - 消息项点击(图片、语音) - [ ] CommentAdapter - 评论点赞按钮 - [ ] BadgesAdapter - 徽章项点击 - [ ] DrawerCardsAdapter - 抽屉卡片点击 - [ ] FriendsAdapter - 好友项点击 - [ ] NearbyUsersAdapter - 附近用户项点击 - [ ] NotificationsAdapter - 通知项点击 - [ ] RoomsAdapter - 直播间项点击 - [ ] UserWorksAdapter - 作品项点击 - [ ] WaterfallRoomsAdapter - 瀑布流直播间项点击 ### 低优先级(不太需要防抖的场景) - [ ] 对话框关闭按钮(用户不太会快速重复点击) - [ ] 底部导航栏切换(系统已有防抖机制) - [ ] 长按事件(不需要防抖) ## 批量替换建议 可以使用以下正则表达式进行批量查找替换: **查找:** ```regex \.setOnClickListener\(v -> \{ ``` **替换为:** ```java .setOnClickListener(new DebounceClickListener() { @Override public void onDebouncedClick(View v) { ``` **注意:** 需要手动添加对应的结束括号 `});` ## 特殊情况处理 ### 1. Lambda表达式单行 ```java // 之前 button.setOnClickListener(v -> finish()); // 之后 button.setOnClickListener(new DebounceClickListener() { @Override public void onDebouncedClick(View v) { finish(); } }); ``` ### 2. 已有变量引用 ```java // 之前 View.OnClickListener listener = v -> doSomething(); button.setOnClickListener(listener); // 之后 View.OnClickListener listener = new DebounceClickListener() { @Override public void onDebouncedClick(View v) { doSomething(); } }; button.setOnClickListener(listener); ``` ### 3. 在Adapter中使用 ```java // 在ViewHolder的bind方法中 public void bind(Item item) { itemView.setOnClickListener(new DebounceClickListener() { @Override public void onDebouncedClick(View v) { if (onItemClickListener != null) { onItemClickListener.onItemClick(item); } } }); } ``` ## 测试建议 添加防抖后,建议测试以下场景: 1. 快速连续点击按钮,确认只触发一次 2. 正常点击间隔(>500ms),确认每次都能触发 3. 不同防抖时间的按钮,确认各自独立工作 4. 列表滚动时点击,确认不会误触发 ## 注意事项 1. **不要对所有点击都添加防抖**:某些场景(如音乐播放器的快进/快退)不适合防抖 2. **防抖时间要合理**:默认500ms适合大多数场景,但某些场景可能需要调整 3. **保持一致性**:同类型的操作使用相同的防抖时间 4. **测试充分**:添加防抖后要测试各种点击场景 ## 进度追踪 - ✅ 已完成:WorkDetailActivity.java - 🔄 进行中:其他Activity - ⏳ 待处理:Adapter类 最后更新:2024-12-24