处理程序 - postDelayed 执行两次

Posted

技术标签:

【中文标题】处理程序 - postDelayed 执行两次【英文标题】:Handler - postDelayed executes twice 【发布时间】:2012-01-08 03:50:53 【问题描述】:

当我使用 Handler 及其 postDelayed 方法时,run() 方法会执行两次。以下是我的部分代码。

Handler deneme = new Handler();

deneme.postDelayed(new Runnable() 

            @Override
            public void run()
            
                randomOyna();
            
        , 1000);

其中 randomOyna 是方法

public void randomOyna()
   
    Log.v("sonOlarak", "çalıştı");

我监控 LogCat 并看到“çalıştı”条目被写入了两次,因此 randomOyna 被调用了两次。该任务是真实计划的,但会在 1 秒和 2 秒后执行。

【问题讨论】:

对这些没有太多经验,但我假设您已经检查过可运行定义代码没有运行两次? 您发布的代码似乎是正确的,如果不知道您在哪里运行该代码,就不可能弄清楚发生了什么。 正如@gwa 所说,我补充说你应该确保你是否没有在代码源的某个位置添加日志 【参考方案1】:

改用这个类并检查它是否已经在运行:

public class Timer 

private java.util.Timer timer;

public synchronized void schedule(final TimerTask timerTask, long delay) 
    stop();
    timer=new java.util.Timer();
    timer.schedule(new TimerTask()

        @Override
        public void run() 
            timerTask.run();
            timer = null;
        ,delay);


public synchronized void stop() 
    if(timer!=null) 
        timer.cancel();
        timer.purge();
        timer = null;
       


public synchronized void scheduleAtFixedRate(TimerTask timerTask, long delay, long period) 
    stop();
    timer=new java.util.Timer();
    timer.scheduleAtFixedRate(timerTask, delay, period);


public boolean isRunning() 
    return timer!=null;
   

【讨论】:

以上是关于处理程序 - postDelayed 执行两次的主要内容,如果未能解决你的问题,请参考以下文章

Android postdelayed处理程序无法启动运行

Android面试题解析美团/抖音/BAThandler.postdelayed方法中的延时,比如设置1000毫秒,程序会准确的在1000毫秒后执行吗?

view.postDelayed()不执行原因

android postDelayed实现

Handler的postDelayed(Runnable, long)

取消 handler.postdelayed 进程