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

226 lines
5.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 防抖功能使用指南
## 已创建的防抖工具类
已创建 `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