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