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

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

增加一个标识,通过标识来判断是否执行定时任务,用户通过触发标识来实现控制。
可以使用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对象。

我个人不太喜欢用Timer,所以大体思路还是通过Handler来实现。
通过postDelayed或sendMessageDelayed来进行消息调度。
首先开一个工作线程用于执行工作,尽量不要在主线程搞。
然后将工作部分构造成Runnable实例。
自动工作采用postDelayed发送达到定时效果;当用户点击时,采用post立刻发送手动工作。
由于同处于工作线程,所有工作是顺序执行的,如果用户点击时正有自动工作在执行,则手动工作会在线程中等待(所以要使用工作线程,主线程可能出现ANR),自动工作执行完毕后手动工作继续执行。
其他的就是通过removeCallback来控制自动工作定时发送的停止逻辑。

您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!
PS:问答VIP年卡 【限时加赠:IT技术图书免费领】,了解详情>>> https://vip.csdn.net/askvip?utm_source=1146287632