完整的数据流程故事
第一幕:用户配置推送地址(设置页面)
用户打开"设置"页面
↓
看到"推送地址"输入框 (fragment_settings.xml 定义的界面)
↓
输入: http://192.168.2.5:8080/api/tags
↓
点击"保存"按钮 (button_save_push_url)
↓
触发 SettingsFragment.savePushUrl() 方法
↓
调用 SharedUtil.savePushUrl(url) 保存到手机本地
↓
显示"设置成功"
关键文件关系:
fragment_settings.xml → 定义界面长什么样
SettingsFragment.java → 处理保存按钮点击事件
SharedUtil.java → 把URL存到手机里(类似存到一个小本本)
第二幕:用户盘存标签(盘存页面)
用户打开"盘存"页面
↓
点击"开始盘存"按钮,扫描RFID标签
↓
扫到了10个标签,数据存在 tagInfoList 里
[
{epc: "E200123...", count: 5},
{epc: "E200456...", count: 3},
...
]
↓
用户看到界面显示:标签数量10个
这时候数据还在手机内存里,没发送出去
第三幕:推送数据到服务器(核心流程)
用户点击"推送"按钮 (button_push)
↓
触发 InventoryFragment.pushData() 方法
↓
第1步:检查有没有数据
if (tagInfoList.size() == 0) → 提示"No Data"
↓
第2步:读取之前保存的推送地址
调用 SharedUtil.getPushUrl()
→ 返回 "http://192.168.2.5:8080/api/tags"
↓
第3步:调用HTTP工具发送数据
HttpUtil.pushTagData(url, tagInfoList, callback)
↓
┌─────────────────────────────────┐
│ HttpUtil 内部做了什么? │
│ 1. 开启新线程(不阻塞界面) │
│ 2. 把 tagInfoList 转成 JSON │
│ [{epc:"E200...", count:5}...]│
│ 3. 发送 HTTP POST 请求 │
│ 4. 等待服务器响应 │
│ 5. 回调结果到主线程 │
└─────────────────────────────────┘
↓
第4步:显示结果
成功 → 显示"Push success"
失败 → 显示"Push failed: 错误信息"
文件之间的依赖关系图
┌─────────────────────────────────────────────────────┐
│ 用户界面层 │
├─────────────────────────────────────────────────────┤
│ │
│ fragment_inventory.xml ←→ InventoryFragment.java│
│ (盘存页面布局) (盘存页面逻辑) │
│ - 推送按钮 - pushData()方法 │
│ - tagInfoList数据 │
│ │
│ fragment_settings.xml ←→ SettingsFragment.java │
│ (设置页面布局) (设置页面逻辑) │
│ - URL输入框 - savePushUrl() │
│ │
└──────────────┬──────────────────────┬───────────────┘
│ │
↓ ↓
┌──────────────────────────┐ ┌──────────────────┐
│ 工具类层 │ │ 数据存储层 │
├──────────────────────────┤ ├──────────────────┤
│ HttpUtil.java │ │ SharedUtil.java │
│ - pushTagData() │ │ - savePushUrl() │
│ - 转JSON │ │ - getPushUrl() │
│ - 发HTTP请求 │ │ (存/读配置) │
└──────────────────────────┘ └──────────────────┘
│
↓
┌──────────────────────────┐
│ 后端服务器 │
│ 192.168.2.5:8080 │
│ /api/tags │
└──────────────────────────┘
用代码调用链来理解
场景1:保存推送地址
// 1. 用户在设置页面输入URL并点保存
SettingsFragment.savePushUrl() {
String url = editTextPushUrl.getText(); // "http://192.168.2.5:8080/api/tags"
// 2. 调用工具类保存
sharedUtil.savePushUrl(url);
}
// 3. SharedUtil把URL存到手机
SharedUtil.savePushUrl(url) {
mSharedPreferences.edit()
.putString("pushUrl", url) // 存到本地
.apply();
}
场景2:推送数据
// 1. 用户在盘存页面点推送按钮
InventoryFragment.pushData() {
// 2. 读取之前保存的URL
String url = sharedUtil.getPushUrl(); // "http://192.168.2.5:8080/api/tags"
// 3. 调用HTTP工具发送数据
HttpUtil.pushTagData(url, tagInfoList, new HttpCallback() {
onSuccess() { 显示"成功" }
onError() { 显示"失败" }
});
}
// 4. HttpUtil发送HTTP请求
HttpUtil.pushTagData(url, tagInfoList, callback) {
new Thread(() -> {
// 5. 转JSON
JSONArray json = 把tagInfoList转成JSON;
// 6. 发POST请求
HttpURLConnection conn = 连接到url;
conn.发送(json);
// 7. 读响应
int code = conn.getResponseCode();
// 8. 回调结果
if (code == 200) {
callback.onSuccess();
} else {
callback.onError();
}
}).start();
}
简单总结
3个核心角色:
SettingsFragment + SharedUtil = 配置管理员
负责让用户输入URL并保存起来
InventoryFragment + tagInfoList = 数据收集员
负责收集盘存的标签数据
HttpUtil = 快递员
负责把数据打包成JSON,送到服务器
它们的关系:
InventoryFragment 问 SharedUtil:"推送地址是啥?"
SharedUtil 回答:"http://192.168.2.5:8080/api/tags"
InventoryFragment 对 HttpUtil 说:"把这些数据送到这个地址"
HttpUtil 执行任务,完成后告诉 InventoryFragment:"送达了!"或"失败了!"