如果您希望继续使用Handler来实现延时而不使用sleep,并且想保持代码结构清晰,可以采用链式postDelayed调用来替代之前的多层嵌套。同时,我将展示如何通过创建一个方法来组织这些延时任务,使得代码更加模块化和易于管理。
首先,移除之前创建的ScheduledExecutorService相关代码,因为我们决定继续使用Handler。然后,创建一个新方法来组织这些延时任务。
修改RunnableTask
首先,我们将runnableTask简化为一个触发器,用于开始延时任务序列。
private Runnable startTapSequence = new Runnable() {
@Override
public void run() {
if (isTestRunning) {
performDelayedTaps();
}
}
};
创建延时任务序列方法
接下来,定义一个方法来组织所有的延时任务。
private void performDelayedTaps() {
// 第一次点击
handler.postDelayed(new Runnable() {
@Override
public void run() {
executeTap(652, 412);
// 第二次点击
handler.postDelayed(new Runnable() {
@Override
public void run() {
executeTap(641, 643);
// 第三次点击
handler.postDelayed(new Runnable() {
@Override
public void run() {
executeTap(639, 618);
}
}, 2500); // 延迟2.5秒
}
}, 2500); // 延迟2.5秒
}
}, 5000); // 初始延迟5秒
}
更新startButton的点击事件
现在,我们只需在按钮点击事件中触发这个延时任务序列。
View startButton = floatingView.findViewById(R.id.start_button);
startButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
isTestRunning = true;
handler.removeCallbacksAndMessages(null); // 清除之前的回调
handler.post(startTapSequence); // 开始延时任务序列
}
});
注意事项
这种方法虽然简单直接,但随着任务复杂度的增加,可能会导致代码难以维护。对于复杂的定时任务,考虑使用Handler的postAtTime或postDelayed结合系统时间来精确控制任务的执行时机,或者重新评估使用ScheduledThreadPoolExecutor等更高级的并发工具。
确保在服务销毁时清理Handler中的所有回调,以避免内存泄漏。
以上代码示例展示了如何使用Handler来实现一系列延时任务,保持了代码的简洁性和可读性。