zhibo/android-app/防抖功能使用指南.md

5.8 KiB
Raw Permalink Blame History

防抖功能使用指南

已创建的防抖工具类

已创建 DebounceClickListener.java,位于:

android-app/app/src/main/java/com/example/livestreaming/DebounceClickListener.java

使用方法

1. 基本用法默认500ms防抖

之前的代码:

button.setOnClickListener(v -> {
    // 处理点击事件
    doSomething();
});

修改后的代码:

button.setOnClickListener(new DebounceClickListener() {
    @Override
    public void onDebouncedClick(View v) {
        // 处理点击事件
        doSomething();
    }
});

2. 自定义防抖时间

button.setOnClickListener(new DebounceClickListener(1000) { // 1秒防抖
    @Override
    public void onDebouncedClick(View v) {
        doSomething();
    }
});

已添加防抖的位置

WorkDetailActivity.java

  • 返回按钮 (backButton)
  • 操作菜单按钮 (actionButton)
  • 点赞按钮 (likeButtonContainer)
  • 收藏按钮 (favoriteButtonContainer)
  • 评论按钮 (commentButtonContainer)
  • 描述文本点击 (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 - 瀑布流直播间项点击

低优先级(不太需要防抖的场景)

  • 对话框关闭按钮(用户不太会快速重复点击)
  • 底部导航栏切换(系统已有防抖机制)
  • 长按事件(不需要防抖)

批量替换建议

可以使用以下正则表达式进行批量查找替换:

查找:

\.setOnClickListener\(v -> \{

替换为:

.setOnClickListener(new DebounceClickListener() {
    @Override
    public void onDebouncedClick(View v) {

注意: 需要手动添加对应的结束括号 });

特殊情况处理

1. Lambda表达式单行

// 之前
button.setOnClickListener(v -> finish());

// 之后
button.setOnClickListener(new DebounceClickListener() {
    @Override
    public void onDebouncedClick(View v) {
        finish();
    }
});

2. 已有变量引用

// 之前
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中使用

// 在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