不用sleep 来实现延时,用handler 实现延时

如果您希望继续使用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来实现一系列延时任务,保持了代码的简洁性和可读性。

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值