请问 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对象。本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 无用评论 打赏 举报 编辑记录