onunix 2023-07-17 10:19 采纳率: 77.8%
浏览 27
已结题

请问这种定时任务和用户请求结合触发的逻辑怎么写?

请问 TimerTask和Timer 做了一个定时器,每2小时执行一次,但是用户也可以触发,如果用户点一下,这个就立即执行一次,希望用户触发和定时触发都使用同一个线程,并且用户点的时候,如果定时任务正在执行,则希望不中断,然后执行完定时任务之后,再马上执行一次,即执行用户请求。用户触发的这个逻辑怎么写合适?必须先Timer cancel,再重新new Timer和 schedual吗?还是有其他方法?

  • 写回答

4条回答 默认 最新

  • CSDN专家-sinJack 2023-07-17 10:28
    关注

    增加一个标识,通过标识来判断是否执行定时任务,用户通过触发标识来实现控制。
    可以使用Handler和postDelayed方法来实现定时任务和用户触发的逻辑

    import android.os.Handler;
    import android.os.Looper;
    public class MyTimer {
        private Handler handler;
        private boolean userTriggered = false;
    
        public MyTimer() {
            handler = new Handler(Looper.getMainLooper());
            handler.postDelayed(new MyTask(), 2 * 60 * 60 * 1000);
        }
    
        public void trigger() {
            userTriggered = true;
        }
    
        private class MyTask implements Runnable {
            @Override
            public void run() {
                // 执行定时任务
                System.out.println("定时任务执行");
    
                // 判断用户是否触发了任务
                if (userTriggered) {
                    // 执行用户请求
                    System.out.println("用户请求执行");
                    userTriggered = false;
                }
    
                // 再次延迟2小时执行定时任务
                handler.postDelayed(this, 2 * 60 * 60 * 1000);
            }
        }
    }
    

    当用户触发了任务时,调用MyTimer的trigger方法来设置userTriggered标志位为true即可。
    不需要先取消原来的handler对象再重新创建一个新的handler对象。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(3条)

报告相同问题?

问题事件

  • 系统已结题 8月6日
  • 已采纳回答 7月29日
  • 创建了问题 7月17日