218 lines
5.9 KiB
Plaintext
218 lines
5.9 KiB
Plaintext
# Glide 图片加载 404 错误解决方案
|
||
|
||
## 错误信息
|
||
|
||
```
|
||
java.io.FileNotFoundException: http://101.43.95.130:8030/uploads/uploads/static/images/goods5.jpg
|
||
at com.bumptech.glide.load.engine.DecodeJob.runWrapped(DecodeJob.java:279)
|
||
```
|
||
|
||
## 问题分析
|
||
|
||
### 错误原因
|
||
1. **图片文件不存在(404错误)**
|
||
- 服务器上不存在该图片文件
|
||
- URL路径可能错误
|
||
|
||
2. **URL路径重复问题**
|
||
- 注意到URL中有 `/uploads/uploads/` 重复路径
|
||
- 可能是服务器端路径拼接错误
|
||
|
||
3. **缺少错误处理**
|
||
- 没有设置错误占位图
|
||
- 错误日志过多,影响性能
|
||
|
||
## 解决方案
|
||
|
||
### ✅ 已实施的修复
|
||
|
||
#### 1. 创建了 GlideUtils 工具类
|
||
- **位置**: `app/src/main/java/utils/GlideUtils.java`
|
||
- **功能**:
|
||
- ✅ 自动修复URL重复路径问题
|
||
- ✅ 404错误静默处理(只记录警告,不打印完整堆栈)
|
||
- ✅ 自动显示占位图
|
||
- ✅ URL有效性验证
|
||
|
||
#### 2. URL自动修复功能
|
||
工具类会自动修复以下问题:
|
||
- `/uploads/uploads/` → `/uploads/`
|
||
- `/static/static/` → `/static/`
|
||
- `/images/images/` → `/images/`
|
||
- 修复双斜杠问题
|
||
|
||
#### 3. 优化了错误日志
|
||
- **404错误**: 只记录警告级别日志,不打印完整堆栈
|
||
- **其他错误**: 记录详细错误信息,便于排查
|
||
|
||
#### 4. 更新了相关代码
|
||
- ✅ `NineImageLoader.java` - 使用统一工具类
|
||
- ✅ `ImageViewerAdapter.java` - 使用统一工具类
|
||
|
||
### 📝 使用示例
|
||
|
||
#### 替换前(旧代码)
|
||
```java
|
||
RequestOptions requestOptions = new RequestOptions();
|
||
requestOptions.placeholder(R.mipmap.icon_default_rectangle);
|
||
requestOptions.error(R.mipmap.icon_default_rectangle);
|
||
Glide.with(context).load(url).apply(requestOptions).into(imageView);
|
||
```
|
||
|
||
#### 替换后(新代码)
|
||
```java
|
||
// 简单调用,自动处理所有错误
|
||
GlideUtils.loadImage(context, url, imageView);
|
||
|
||
// 或指定占位图
|
||
GlideUtils.loadImage(context, url, imageView, R.mipmap.icon_default_rectangle);
|
||
```
|
||
|
||
### 🔧 需要更新的文件
|
||
|
||
以下文件建议逐步替换为使用 `GlideUtils`:
|
||
|
||
1. **DiscoveryFragment.java** (第666行)
|
||
```java
|
||
// 替换前
|
||
Glide.with(getContext()).load(discoveryListEntity.getAvatar())
|
||
.apply(requestOptions)
|
||
.into(homeGridAdapterItemBinding.imageHead);
|
||
|
||
// 替换后
|
||
GlideUtils.loadCircleImage(getContext(), discoveryListEntity.getAvatar(),
|
||
homeGridAdapterItemBinding.imageHead);
|
||
```
|
||
|
||
2. **HistoryRecordFragment.java** (第376行)
|
||
```java
|
||
// 替换前
|
||
Glide.with(context).load(discoveryListEntity.getAvatar())
|
||
.apply(requestOptions)
|
||
.into(homeGridAdapterItemBinding.imageHead);
|
||
|
||
// 替换后
|
||
GlideUtils.loadCircleImage(context, discoveryListEntity.getAvatar(),
|
||
homeGridAdapterItemBinding.imageHead);
|
||
```
|
||
|
||
3. **MainFragment.java** (第1055行)
|
||
- 同样替换为使用 `GlideUtils`
|
||
|
||
## URL路径问题修复
|
||
|
||
### 问题URL示例
|
||
```
|
||
http://101.43.95.130:8030/uploads/uploads/static/images/goods5.jpg
|
||
```
|
||
|
||
### 修复后的URL
|
||
```
|
||
http://101.43.95.130:8030/uploads/static/images/goods5.jpg
|
||
```
|
||
|
||
### 自动修复逻辑
|
||
`GlideUtils` 会自动检测并修复:
|
||
- 重复的路径段
|
||
- 多余的双斜杠
|
||
- 路径格式问题
|
||
|
||
## 错误处理机制
|
||
|
||
### 1. 404错误处理
|
||
- ✅ 自动显示占位图
|
||
- ✅ 只记录警告日志(不打印堆栈)
|
||
- ✅ 不影响用户体验
|
||
|
||
### 2. 其他错误处理
|
||
- ✅ 显示错误占位图
|
||
- ✅ 记录详细错误日志
|
||
- ✅ 便于问题排查
|
||
|
||
### 3. URL验证
|
||
- ✅ 检查URL是否为空
|
||
- ✅ 验证URL格式
|
||
- ✅ 无效URL直接显示占位图
|
||
|
||
## 测试验证
|
||
|
||
### 测试场景
|
||
1. ✅ **正常图片加载** - 验证图片正常显示
|
||
2. ✅ **404错误** - 验证占位图显示,日志为警告级别
|
||
3. ✅ **无效URL** - 验证占位图显示
|
||
4. ✅ **重复路径URL** - 验证自动修复功能
|
||
|
||
### 验证方法
|
||
1. 查看日志,确认404错误只显示警告
|
||
2. 检查图片加载失败时是否显示占位图
|
||
3. 验证URL修复功能是否生效
|
||
|
||
## 服务器端建议
|
||
|
||
### 问题URL分析
|
||
```
|
||
http://101.43.95.130:8030/uploads/uploads/static/images/goods5.jpg
|
||
^^^^^^^^
|
||
重复路径
|
||
```
|
||
|
||
### 建议修复
|
||
1. **检查服务器端路径拼接逻辑**
|
||
- 文件: `AddGoodsInfo.php` 或其他相关接口
|
||
- 确保路径拼接正确,避免重复
|
||
|
||
2. **验证图片文件是否存在**
|
||
- 检查服务器上是否存在该图片
|
||
- 确认文件路径配置正确
|
||
|
||
3. **统一图片路径格式**
|
||
- 使用统一的路径前缀
|
||
- 避免路径拼接错误
|
||
|
||
## 性能优化
|
||
|
||
### 已实现的优化
|
||
- ✅ 内存缓存启用
|
||
- ✅ 磁盘缓存启用
|
||
- ✅ 错误日志优化(减少不必要的堆栈打印)
|
||
|
||
### 建议的进一步优化
|
||
1. **图片尺寸限制**
|
||
```java
|
||
RequestOptions options = new RequestOptions()
|
||
.override(800, 800) // 限制最大尺寸
|
||
.centerCrop();
|
||
```
|
||
|
||
2. **批量加载优化**
|
||
- 使用 `Glide.with(context).pauseRequests()` 暂停请求
|
||
- 在列表滚动时暂停加载
|
||
|
||
## 总结
|
||
|
||
### ✅ 已解决的问题
|
||
1. ✅ 404错误导致的应用崩溃风险
|
||
2. ✅ 错误日志过多影响性能
|
||
3. ✅ URL路径重复问题
|
||
4. ✅ 缺少统一的错误处理
|
||
|
||
### 📋 后续建议
|
||
1. **逐步替换现有Glide调用**
|
||
- 将所有 `Glide.with()` 调用替换为 `GlideUtils.loadImage()`
|
||
- 统一错误处理机制
|
||
|
||
2. **服务器端修复**
|
||
- 修复路径拼接逻辑
|
||
- 确保图片文件存在
|
||
|
||
3. **监控和统计**
|
||
- 添加图片加载失败统计
|
||
- 监控404错误频率
|
||
|
||
---
|
||
|
||
**修复时间**: 2026-01-09
|
||
**影响范围**: 所有使用Glide加载图片的地方
|
||
**严重程度**: 中等(功能正常,但错误日志过多)
|
||
|