這是一個薪資查詢 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<>(); // 列表資料源
setContentView 載入佈局。Handler(this) 實現 Callback,handleMessage 處理網路回傳。HttpManager 持有 handler,網路完成後 handler.sendMessage(msg) 切回主執行緒。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>。