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

Android 程式碼詳細註解:MoneyActivity 完整解析

     編輯:程式設計疑難解答

這是一個薪資查詢 Activity,包含日期選擇、網路請求、列表展示。以下為關鍵邏輯逐行註解:

核心欄位

private View backBtn;          // 返回按鈕
private Handler handler;       // 主執行緒 Handler,接收網路回調
private HttpManager httpManager; // 網路請求封裝
private EditText dateEdit;     // 日期輸入框 (點擊彈 DatePicker)
private ListView moneyList;    // 薪資列表
List<Map<String,Object>> data = new ArrayList<>(); // 列表資料源

onCreate 流程

  1. setContentView 載入佈局。
  2. 建立 Handler(this) 實現 Callback,handleMessage 處理網路回傳。
  3. HttpManager 持有 handler,網路完成後 handler.sendMessage(msg) 切回主執行緒。
  4. 綁定返回鈕點擊、日期框點擊監聽。
  5. 取得當前年月,呼叫 getList(year, month) 載入預設資料。

日期選擇邏輯

  • 點擊 dateEdit 彈出 DatePickerDialog。
  • OnDateSetListener 中限制只能查詢今年或去年資料。
  • 選擇後更新 dateEdit 文字,再次呼叫 getList 刷新。
  • findDatePicker 遞迴查找 Dialog 內的 DatePicker,隱藏「日」選擇器 (只保留年月)。

網路請求與解析

// getList 組裝 URL,發送 GET 請求
Message msg = new Message(); msg.what = 0;
httpManager.getRequest(uri, msg); // 非同步執行,完成後回調 handleMessage

// handleMessage (主執行緒)
switch (msg.what) {
    case 0:
        String result = (String) msg.obj;
        JSONObject json = new JSONObject(result);
        if ("1".equals(json.optString("error_code"))) { showError(json.optString("msg")); return; }
        JSONArray list = json.getJSONObject("data").getJSONArray("list");
        data.clear(); // 關鍵:刷新前清空舊資料
        for (int i=0; i<list.length(); i++) {
            JSONObject item = list.getJSONObject(i);
            Map<String,Object> map = new HashMap<>();
            map.put("money_type", item.optString("Type"));
            map.put("money_num", item.optString("value"));
            data.add(map);
        }
        // 建立 SimpleAdapter 綁定列表
        SimpleAdapter adapter = new SimpleAdapter(this, data, R.layout.money_items,
                new String[]{"money_type","money_num"}, new int[]{R.id.moneyType,R.id.money});
        moneyList.setAdapter(adapter);
        break;
}

常見問題與優化建議

  • 資料重複:若不 data.clear(),每次查詢會疊加。
  • 記憶體洩漏:Handler(this) 持有 Activity 參考,若請求未完成 Activity 銷毀會洩漏,建議用 static class MyHandler extends Handler + WeakReference<Activity>。
  • 網路庫升級:建議換用 Retrofit/OkHttp + 協程/Flow,簡化回調地獄。
  • 日期選擇器:MaterialDatePicker (Material Components) 體驗更現代,支援年月模式無需遞迴隱藏。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved