【问题标题】:Runnable is executed long time after postDelayed's delayRunnable 在 postDelayed 延迟后很长时间执行
【发布时间】:2014-07-19 02:30:49
【问题描述】:

在某些时候,我希望 我的服务 在 2 秒后执行某些操作。 所以——我准备了一个指定的Handler:

private Handler handler;
...
HandlerThread thread = new HandlerThread("LNT");
thread.start();
handler = new Handler(thread.getLooper());

然后我打电话给

handle.postDelayed (new Runnable(){
    public void run(){
        doSomething();
}, (long)(2000));

有时 soSomething() 会在 2 秒后被调用,但很多时候需要 15 秒!!

我做错了什么? 是否有另一种方法可以在特定时间后运行某些东西

【问题讨论】:

  • 如何确定 doSomething 何时运行?
  • 您对这个问题有更深入的了解吗?我看到了类似的东西。
  • @DuduArbel 你找到解决方案了吗?我有同样的问题,只是有时在某些手机上。无论我们如何延迟执行,它最终都会成为一个带有 postdelayed 的处理程序,并且问题仍然存在。

标签: android runnable timing android-handler


【解决方案1】:

您可能需要在 Main Looper 上执行您的工作。太好了,为什么不这样做:

new Handler(context.getMainLooper()).postDelayed(new Runnable(){
   @Override
   public void run(){
      doSomething();
   }
}, 2000);

只需测试它并给我您的反馈;)

【讨论】:

  • 为什么会有不同?
  • 它也发生在主循环器上。这就是为什么我试图将执行移至指定线程
  • 这如何解决原发帖人提出的问题?你读过这个问题吗?
【解决方案2】:

您的处理程序可能正忙于其他任务。有时最好使用ExecutorService,例如Executors.newCachedThreadPool()。或者无论如何,这就是我刚刚解决类似问题的方式。

【讨论】:

    【解决方案3】:

    你可以这样做

    private static final byte LNT = 1;
    
    private Handler handler = new Handler()
    {
        @Override
        public void handleMessage(Message msg)
        {
            switch (msg.what)
            {
                case LNT:
    
                    Handler handler = null;
                    handler = new Handler();
                    handler.postDelayed(new Runnable()
                    {
                        public void run()
                        {
                            doSomething();
                        }
                    },2000);
                break;
    
                default:
                break;
            }
         }
    }
    

    你用 :

    来称呼它
    handler.sendEmptyMessage(LNT);
    

    【讨论】:

    • 为什么会有不同?
    • what 值基本上是一个整数,允许接收者识别它接收到的消息。我们传递了一个 Message 对象,我们可以检查 public 字段来找出消息是关于什么的。 (味精。什么)。这个想法是在这种情况下你只有一种类型的消息,并且处理程序确实理解这一点。所以它不需要检查它收到了什么样的消息它只需要接收一条消息并在你修复的时间之后执行它(这里是 2 秒后。
    • 这如何解决原发帖人提出的问题?你读过这个问题吗?
    猜你喜欢
    • 1970-01-01
    • 2014-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多