【问题标题】:The effects of firing off a runnable multiple times using a Handler使用 Handler 多次触发 runnable 的效果
【发布时间】:2017-05-23 11:41:08
【问题描述】:

我有这样的简单可运行对象

private Runnable runnable = new Runnable()
{
    @Override
    public void run()
    {
        someVariable = true;
    }
};

我将它与 Handler 一起使用并像这样延迟

handler.postDelayed(runnable, 60000);

如果这个功能被垃圾邮件发送并且上面被重复调用,它会向消息队列添加多次运行。

如果是这种情况,是否在添加另一个之前先检查消息队列中是否有一个?

【问题讨论】:

  • 我不了解Android,所以不知道有没有更好的方法,如果没有,那么你可以使用全局AtomicInteger来保持你自己的实例数正在排队。 run() 方法的第一行可以递减计数,每次postDelayed(...) 时都可以递增计数。 (或者不,如果计数已经太高。)

标签: java android multithreading handler runnable


【解决方案1】:

您好,我的做法是在我的处理程序运行一次后删除消息和回调。我的代码的一个简单示例是

final Handler handler = new Handler();

    Runnable runnable = new Runnable() {
        @Override
        public void run() {
            Log.d("runnable", "handler invoked just once");
            handler.removeCallbacksAndMessages(null);
        }
    };

    handler.postDelayed(runnable, 2000);
    handler.postDelayed(runnable, 2000); // demo: if this is called multiple times my runnable code wont run

【讨论】:

  • 这条评论是什么意思 // demo: 如果多次调用我的可运行代码将无法运行
  • 嗨,Rob,handler.removeCallbacksAndMessages(null); inside runnable 从消息队列中删除处理程序回调和消息。当我的 handler.postDelayed(runnable, 2000) 被多次发送垃圾邮件时,runnable 中的 someVariable = true 代码不会被执行多次。评论:demo 演示了处理程序被调用两次,而可运行代码只执行一次。
  • 谢谢Rishabh,只是为了澄清这只会删除使用此处理程序创建的消息和回调,通过应用程序创建的任何其他处理程序不会受到影响?或者这是所有消息的主队列?
  • 它删除由调用 removeCallbacksAndMessages() 函数的处理程序创建的消息和回调,而不是其他处理程序。所以它可以安全使用。希望这个帖子可以帮助你 Rob stackoverflow.com/questions/26126474/…
  • 谢谢 Rishabh :-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-11
  • 1970-01-01
  • 2011-07-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多