首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

Android 代碼深度解析:MoneyActivity 完整註釋與邏輯梳理

     編輯:程式設計疑難解答

代碼概覽

MoneyActivity 是一個典型的 Android 傳統寫法(非 MVP/MVVM),實現了「選擇年月 → 請求薪資列表 → 顯示在 ListView」的完整流程。代碼包含網絡請求、日期選擇、JSON 解析、UI 更新等核心模塊。

關鍵組件註釋

1. 成員變量與初始化 (onCreate)

private View backBtn;          // 返回按鈕
private EditText dateEdit;     // 年月輸入框(不可直接編輯,點擊彈出選擇器)
private ListView moneyList;    // 薪資列表
private List<Map<String, Object>> data = new ArrayList<>(); // 列表數據源
Handler handler = new Handler(this); // UI 線程 Handler,用於網絡回調
HttpManager httpManager = new HttpManager(handler); // 封裝的網絡工具類

啟動時自動獲取當前年月的數據:getList(year, month)。

2. 網絡請求封裝 (getList)

構造帶 sid、年、月參數的 URL,發送 what=0 的 Message 給 HttpManager 異步獲取數據。

3. 日期選擇邏輯 (onClick → DatePickerDialog)

  • 限制只能查看今年和去年的數據。
  • 選擇後更新 dateEdit 顯示並重新請求 getList。
  • 通過遞歸 findDatePicker 隱藏 DatePicker 中的「日」選擇器(只保留年月)。

4. 消息處理與 JSON 解析 (handleMessage)

case 0: // 網絡返回
    String result = (String) msg.obj;
    JSONObject json = new JSONObject(result);
    if ("1".equals(json.getString("error_code"))) { // 業務錯誤
        DialogUtil.showDialog(...);
        return false;
    }
    JSONArray list = json.getJSONObject("data").getJSONArray("list");
    // 遍歷構建 Map 列表
    for (JSONObject item : list) {
        Map<String, Object> map = new HashMap<>();
        map.put("money_type", item.getString("Type"));
        map.put("money_num", item.getString("value"));
        data.add(map);
    }
    // 綁定 SimpleAdapter
    moneyList.setAdapter(new SimpleAdapter(...));
    break;

5. 潛在問題與優化建議

  • Handler 洩漏風險:內部類持有 Activity 引用,建議改用 WeakReference 或 static Handler + WeakReference<Activity>。
  • 網絡庫過時:HttpManager 疑似自定義封裝,現代項目建議遷移到 OkHttp/Retrofit + 協程/Flow。
  • UI 更新在主線程:當前寫法正確,但解析大量 JSON 時建議放入子線程(如 runOnUiThread 或 RxJava)。
  • 硬編碼字符串:"Type"、"value" 應定義為常量。

總結

這段代碼展示了 Android 早期「萬能 Activity」模式的典型結構:View 初始化 → 事件綁定 → 異步請求 → Handler 回調 → 解析數據 → 更新 UI。雖然結構清晰,但在現代開發中應拆分職責,引入 ViewBinding、ViewModel、Repository 等架構組件,提升可維護性與測試性。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved