yirj
2021-01-28 17:39
采纳率: 66.7%
浏览 167
已结题

Android定时器问题:自动触发的定时器,如何保证定时器在后台一直跑时不会自动的再次触发?

描述问题:Android开发定时器问题,APP进入某界面自动触发的定时器10秒打印一次输出,如何保证定时器在后台一直跑的情况下,下次进入某界面时不会自动的再次触发?

遇到情况:定时器因为是自动的触发,所以说只要到了某界面就会自动的触发一次,导致随着自动触发的次数的增多就开启了很多个定时器,打印输出就没有任何规律可言了。

当前代码:下面的代码自动触发开启定时器之后,只要APP在运行状态,不清除app后台的运行就会一直跑,因为进入APP某界面自动触发,所以会触发很多个定时器,最后定时器的定时输出就没有什么规律可言了。

​
            // 初始化定时器--10秒钟打印一次输出
            Timer timer = new Timer();
            timer.schedule(new TimerTask() {
                @Override
                public void run() {
                    //这里写的是逻辑,用输出语句代替 10秒打印一次
                    System.out.println("定时器正在运行...");
                }
            }, 0, 10 * 1000); //delay: 从定时器初始化成功 开始启动的延迟时间。period:定时器的间隔时间

​

希望各位大神在上面的代码的基础上,可以帮帮我想一个解决的办法,定时器这个东西把我绕的有些晕了!希望附上一个详细的代码,再次感谢各位大佬,感激不尽!

  • 点赞
  • 收藏

5条回答 默认 最新

  • qq_1113502097 2021-01-29 10:42
    已采纳

    你写在活动的时候,每次进入活动都会创建一个新的定时器。如果只要一个定时器,你应该考虑把定时器写在server上,或者在Application里面写一个静态对象。写一个调用的时候的初始化方法,并且在APP被干掉的时候中止定时器。

    public class App extends Application {
    
        //APP是否被干掉
        public static boolean isDestory=false;
    
        //定时器是否已经创建
        public static boolean isHave=false;
    
    
    public static void initTimer(){
            if (!isHave){
                isHave=true;
                new Timer().schedule(new TimerTask() {
                    @Override
                    public void run() {
                        if (isDestory){
                            //APP被干掉,结束定时器
                            isHave=false;
                            cancel();
                        }else {
                            Log.e("TAG", "run: ");
                        }
    
    
                    }
                },200,1000*10);
            }
        }
    
        @Override
        public void onTerminate() {
            isDestory=false;
            super.onTerminate();
        }
    
    }
    点赞 打赏 评论
  • 荣员外 2021-01-28 19:39

    用server,后台启动一个进程做上述操作;

    点赞 打赏 评论
  • 蓝色的天空ywj 2021-01-29 09:12

    在页面销毁时,移除掉定时任务

        @Override
        protected void onDestroy() {
            super.onDestroy();
            timer.cancel();
        }
    点赞 打赏 评论
  • yirj 2021-01-29 10:00

    “在页面销毁时,移除掉定时任务”,移除了的就不叫一直跑的定时任务了,不太可行。

    点赞 打赏 评论
  • yirj 2021-01-29 10:50

    你说的这个和我现在实现的差不多,很感谢,这是我实现之后写的文章https://blog.csdn.net/yi_rui_jie/article/details/113363585

    点赞 打赏 评论

相关推荐 更多相似问题