213 lines
7.2 KiB
Plaintext
213 lines
7.2 KiB
Plaintext
|
|
# 版本检查接口业务逻辑实现
|
|||
|
|
|
|||
|
|
## 📋 实现概述
|
|||
|
|
|
|||
|
|
参考 `AppService.getUserInfo` 的实现方式,为 `/api/common/checkAppVersion` 接口创建了完整的业务逻辑封装,包括数据模型、服务方法和调用逻辑。
|
|||
|
|
|
|||
|
|
## 🔧 实现内容
|
|||
|
|
|
|||
|
|
### 1. **AppService.checkAppVersion 方法**
|
|||
|
|
|
|||
|
|
**文件**: `uikit/src/main/java/cn/wildfire/chat/kit/net/AppService.java`
|
|||
|
|
|
|||
|
|
```java
|
|||
|
|
//检查app版本 /api/common/checkAppVersion
|
|||
|
|
public void checkAppVersion(String version, int versionCode, String platform, SimpleCallback callback){
|
|||
|
|
String url = APP_SERVER_ADDRESS + "/api/common/checkAppVersion";
|
|||
|
|
Map<String, Object> params = new HashMap<>();
|
|||
|
|
params.put("version", version);
|
|||
|
|
params.put("versionCode", versionCode);
|
|||
|
|
params.put("platform", platform);
|
|||
|
|
OKHttpHelper.post(url, params, Constants.getOkhttpHeaderParams(), callback);
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**特点**:
|
|||
|
|
- ✅ 参考 `getUserInfo` 方法的实现模式
|
|||
|
|
- ✅ 使用 `OKHttpHelper.post` 发送请求
|
|||
|
|
- ✅ 自动添加认证头信息 `Constants.getOkhttpHeaderParams()`
|
|||
|
|
- ✅ 支持泛型回调 `SimpleCallback<CheckAppVersionResult>`
|
|||
|
|
|
|||
|
|
### 2. **CheckAppVersionResult 数据模型**
|
|||
|
|
|
|||
|
|
**文件**: `uikit/src/main/java/cn/wildfire/chat/kit/net/model/CheckAppVersionResult.java`
|
|||
|
|
|
|||
|
|
```java
|
|||
|
|
public class CheckAppVersionResult extends StatusResult<CheckAppVersionResult> implements Serializable {
|
|||
|
|
private int id;
|
|||
|
|
private String platform;
|
|||
|
|
private int version_code;
|
|||
|
|
private String version_name;
|
|||
|
|
private String update_content;
|
|||
|
|
private String download_url;
|
|||
|
|
private int file_size;
|
|||
|
|
private String is_force_update;
|
|||
|
|
private String is_latest;
|
|||
|
|
private String status;
|
|||
|
|
private long createtime;
|
|||
|
|
private long updatetime;
|
|||
|
|
|
|||
|
|
// 业务逻辑方法
|
|||
|
|
public boolean hasUpdate() {
|
|||
|
|
return "0".equals(is_latest);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public boolean isForceUpdate() {
|
|||
|
|
return "1".equals(is_force_update);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**特点**:
|
|||
|
|
- ✅ 继承 `StatusResult<CheckAppVersionResult>` 基类
|
|||
|
|
- ✅ 包含所有服务器返回的字段
|
|||
|
|
- ✅ 提供业务逻辑方法 `hasUpdate()` 和 `isForceUpdate()`
|
|||
|
|
- ✅ 实现 `Serializable` 接口支持序列化
|
|||
|
|
|
|||
|
|
### 3. **MainActivity 调用逻辑优化**
|
|||
|
|
|
|||
|
|
**文件**: `app/src/main/java/com/xunpaisoft/social/im/main/MainActivity.java`
|
|||
|
|
|
|||
|
|
```java
|
|||
|
|
private void requestVersion() {
|
|||
|
|
Log.d("MainActivity", "开始请求最新版本号");
|
|||
|
|
|
|||
|
|
// 使用AppService.checkAppVersion方法,参考getUserInfo的实现方式
|
|||
|
|
AppService.Instance().checkAppVersion(dangqianversion, VersionUtils.getVersionCode(this), "2", new SimpleCallback<CheckAppVersionResult>() {
|
|||
|
|
@Override
|
|||
|
|
public void onUiSuccess(CheckAppVersionResult result) {
|
|||
|
|
if (result != null && result.isSuccess()) {
|
|||
|
|
CheckAppVersionResult data = result.getData();
|
|||
|
|
if (data != null) {
|
|||
|
|
// 版本比较和弹窗显示逻辑
|
|||
|
|
int versionUpdate = VersionUtils.compareVersion(dangqianversion, data.getVersion_name());
|
|||
|
|
if (versionUpdate == -1) {
|
|||
|
|
showVersionUpdateDialog(data.getVersion_name(), data.getUpdate_content(), data.getDownload_url(), data.isForceUpdate());
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
@Override
|
|||
|
|
public void onUiFailure(int code, String msg) {
|
|||
|
|
Log.e("MainActivity1", "版本检查网络请求失败: " + code + " - " + msg);
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**特点**:
|
|||
|
|
- ✅ 使用类型安全的 `SimpleCallback<CheckAppVersionResult>`
|
|||
|
|
- ✅ 直接访问数据模型属性,无需手动解析JSON
|
|||
|
|
- ✅ 使用业务逻辑方法 `data.isForceUpdate()` 和 `data.hasUpdate()`
|
|||
|
|
- ✅ 代码简洁,易于维护
|
|||
|
|
|
|||
|
|
## 🎯 业务逻辑对比
|
|||
|
|
|
|||
|
|
### **修改前 (手动解析LinkedTreeMap)**
|
|||
|
|
```java
|
|||
|
|
// 复杂的LinkedTreeMap解析
|
|||
|
|
if (response instanceof java.util.LinkedTreeMap) {
|
|||
|
|
java.util.LinkedTreeMap<String, Object> responseMap = (java.util.LinkedTreeMap<String, Object>) response;
|
|||
|
|
Object codeObj = responseMap.get("code");
|
|||
|
|
int code = codeObj instanceof Number ? ((Number) codeObj).intValue() : -1;
|
|||
|
|
// ... 大量类型转换代码
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### **修改后 (使用数据模型)**
|
|||
|
|
```java
|
|||
|
|
// 简洁的类型安全访问
|
|||
|
|
if (result != null && result.isSuccess()) {
|
|||
|
|
CheckAppVersionResult data = result.getData();
|
|||
|
|
String versionName = data.getVersion_name();
|
|||
|
|
boolean forceUpdate = data.isForceUpdate();
|
|||
|
|
// ... 直接使用属性
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 📊 优势对比
|
|||
|
|
|
|||
|
|
| 方面 | 修改前 | 修改后 |
|
|||
|
|
|------|--------|--------|
|
|||
|
|
| **类型安全** | ❌ 运行时类型检查 | ✅ 编译时类型检查 |
|
|||
|
|
| **代码可读性** | ❌ 复杂的类型转换 | ✅ 直观的属性访问 |
|
|||
|
|
| **维护性** | ❌ 硬编码字段名 | ✅ 自动补全和重构支持 |
|
|||
|
|
| **错误处理** | ❌ 手动异常处理 | ✅ 框架自动处理 |
|
|||
|
|
| **业务逻辑** | ❌ 分散在调用处 | ✅ 封装在数据模型中 |
|
|||
|
|
|
|||
|
|
## 🔄 调用流程
|
|||
|
|
|
|||
|
|
1. **MainActivity.requestVersion()**
|
|||
|
|
- 获取当前版本信息
|
|||
|
|
- 调用 `AppService.checkAppVersion()`
|
|||
|
|
|
|||
|
|
2. **AppService.checkAppVersion()**
|
|||
|
|
- 构建请求参数
|
|||
|
|
- 发送HTTP请求
|
|||
|
|
- 返回 `CheckAppVersionResult` 对象
|
|||
|
|
|
|||
|
|
3. **CheckAppVersionResult**
|
|||
|
|
- 自动解析JSON响应
|
|||
|
|
- 提供业务逻辑方法
|
|||
|
|
- 类型安全的数据访问
|
|||
|
|
|
|||
|
|
4. **MainActivity 处理结果**
|
|||
|
|
- 版本比较
|
|||
|
|
- 显示更新弹窗
|
|||
|
|
- 处理用户选择
|
|||
|
|
|
|||
|
|
## 🎉 实现效果
|
|||
|
|
|
|||
|
|
- ✅ **代码简洁**: 从100+行复杂解析代码简化为20行清晰逻辑
|
|||
|
|
- ✅ **类型安全**: 编译时检查,避免运行时类型错误
|
|||
|
|
- ✅ **易于维护**: 统一的接口调用模式,便于后续扩展
|
|||
|
|
- ✅ **业务封装**: 版本检查逻辑封装在数据模型中
|
|||
|
|
- ✅ **框架一致**: 与现有 `getUserInfo` 等方法保持一致的调用模式
|
|||
|
|
|
|||
|
|
## 📝 使用示例
|
|||
|
|
|
|||
|
|
```java
|
|||
|
|
// 参考getUserInfo的调用方式
|
|||
|
|
AppService.Instance().getUserInfo(user_id, is_friend, new SimpleCallback<GetUserInfoResult>() {
|
|||
|
|
@Override
|
|||
|
|
public void onUiSuccess(GetUserInfoResult infoResult) {
|
|||
|
|
if (infoResult != null) {
|
|||
|
|
GetUserInfoResult data = infoResult.getData();
|
|||
|
|
// 处理用户信息
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
@Override
|
|||
|
|
public void onUiFailure(int code, String msg) {
|
|||
|
|
// 处理错误
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
|
|||
|
|
// 版本检查的调用方式(完全一致的模式)
|
|||
|
|
AppService.Instance().checkAppVersion(version, versionCode, platform, new SimpleCallback<CheckAppVersionResult>() {
|
|||
|
|
@Override
|
|||
|
|
public void onUiSuccess(CheckAppVersionResult result) {
|
|||
|
|
if (result != null) {
|
|||
|
|
CheckAppVersionResult data = result.getData();
|
|||
|
|
// 处理版本信息
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
@Override
|
|||
|
|
public void onUiFailure(int code, String msg) {
|
|||
|
|
// 处理错误
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 🎯 总结
|
|||
|
|
|
|||
|
|
通过参考 `AppService.getUserInfo` 的实现方式,成功为版本检查接口创建了完整的业务逻辑封装:
|
|||
|
|
|
|||
|
|
1. **统一的服务层**: `AppService.checkAppVersion()` 方法
|
|||
|
|
2. **类型安全的数据模型**: `CheckAppVersionResult` 类
|
|||
|
|
3. **简洁的调用逻辑**: `MainActivity.requestVersion()` 方法
|
|||
|
|
|
|||
|
|
这种实现方式不仅解决了当前的LinkedTreeMap解析问题,还为后续的接口开发提供了标准化的模板,提高了代码的可维护性和可扩展性。
|