如何将EditText输入值作为Handler中postDelayed的延迟参数?
停车时长动态延迟解决方案
核心思路
把固定的延迟参数30000替换为用户在EditText中输入的时长(转换为毫秒),同时做好输入校验避免崩溃,还要处理Handler的内存泄漏问题。
具体实现步骤
获取用户输入并校验
先拿到EditText的输入内容,判断是否为空、是否为有效数字:EditText etParkingDuration = findViewById(R.id.et_parking_duration); String durationInput = etParkingDuration.getText().toString().trim(); // 空输入校验 if (TextUtils.isEmpty(durationInput)) { Toast.makeText(this, "请输入停车时长", Toast.LENGTH_SHORT).show(); return; } long delayMillis; try { // 假设用户输入的是【分钟】,转换为毫秒(如果是秒就改成 *1000L) int minutes = Integer.parseInt(durationInput); delayMillis = minutes * 60 * 1000L; } catch (NumberFormatException e) { Toast.makeText(this, "请输入有效的数字", Toast.LENGTH_SHORT).show(); return; }修改延迟逻辑,修复内存泄漏
原代码用匿名内部类的Handler会持有Activity引用,容易导致内存泄漏,改用静态内部类+WeakReference的写法:// 静态内部类Handler,避免内存泄漏 private static class ParkingHandler extends Handler { private final WeakReference<YourParkActivity> activityRef; public ParkingHandler(YourParkActivity activity) { activityRef = new WeakReference<>(activity); } @Override public void handleMessage(Message msg) { YourParkActivity activity = activityRef.get(); if (activity == null || activity.isFinishing()) { return; } // 恢复按钮为绿色并重置点击事件 Button button1 = activity.findViewById(R.id.button1); button1.setBackgroundColor(Color.GREEN); // 替换原魔法值,代码更易读 button1.setOnClickListener(v -> { Intent intent = new Intent(activity, Slot1.class); activity.startActivity(intent); }); } } // 初始化Handler private ParkingHandler parkingHandler; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.your_park_layout); parkingHandler = new ParkingHandler(this); } // 支付成功后调用此方法启动延迟 private void startParkingRecovery(long delayMillis) { parkingHandler.postDelayed(() -> { YourParkActivity activity = parkingHandler.activityRef.get(); if (activity == null || activity.isFinishing()) { return; } Button button1 = activity.findViewById(R.id.button1); button1.setBackgroundColor(Color.GREEN); button1.setOnClickListener(v -> { Intent intent = new Intent(activity, Slot1.class); activity.startActivity(intent); }); }, delayMillis); }在支付成功逻辑中调用
当用户支付完成后,调用startParkingRecovery(delayMillis)传入转换后的延迟毫秒值即可。Activity销毁时清理Handler
避免Activity销毁后Handler仍执行回调,在onDestroy中移除所有回调:@Override protected void onDestroy() { super.onDestroy(); if (parkingHandler != null) { parkingHandler.removeCallbacksAndMessages(null); } }
补充说明
- 如果用户输入的是秒,把单位转换代码改成
int seconds = Integer.parseInt(durationInput); delayMillis = seconds * 1000L;即可 - 建议用资源文件定义颜色(比如
res/values/colors.xml中定义<color name="green">#FF00FF00</color>),然后用getResources().getColor(R.color.green)调用,适配主题变更
内容的提问来源于stack exchange,提问作者Максим Сеник
相关产品推荐
相关产品推荐

