【问题标题】:Handler.postDelayed v/s Runnable.run. Is it alright to call .run instead of .postDelayed?Handler.postDelayed v/s Runnable.run。调用 .run 而不是 .postDelayed 可以吗?
【发布时间】:2015-04-18 12:20:29
【问题描述】:

我试图实现循环Runnable。我发现的示例似乎使用以下想法来启动可运行文件。

        handler = new Handler();
        final Runnable r = new Runnable() {
            public void run() {
                handler.postDelayed(this, 10000);
                doIt();
                count ++;
            }
        };
        r.run();// what I prefer
//      handler.postDelayed(r, 1000);//their idea

我更喜欢使用对run() 方法的调用来启动Runnable。如果直接致电run(),我可能会遇到什么麻烦!

谢谢! :)

【问题讨论】:

  • 您希望它现在运行,还是在 1000 毫秒后运行?
  • 处理程序有什么问题?为什么你不喜欢它们,它们解决了很多你在跑步时会遇到的问题。
  • @immibis 我不确定 postDelayed 是否会做更多的事情,而不仅仅是将其延迟发布到队列中。看起来没什么别的了。
  • @BojanKseneman 只是不舒服而已。你能详细说明一下吗? :)
  • 本身就可以很好地运行它非常愚蠢。当你试图通知它某事、中断它、取消它、从另一个线程传递一些数据时,你会发现它缺乏功能。如果您知道如何正确使用它,Handler 会为您处理这些案例。我建议您了解更多关于它的信息,您可能会开始喜欢它并避免运行可运行文件。最重要的是它是线程安全的,它允许线程之间的通信!

标签: java android multithreading runnable android-handler


【解决方案1】:

如果您调用r.run()Runnable 将立即执行。但是如果你按照他们的建议调用handler.postDelayed(r, 1000);Runnable 将在 1s 过去之前执行。所以,这是第一点。二、为什么不用Android提供的Thread Loop merchanism,即HandlerAsyncTaskHandlerThread,因为Android支持的很好?

【讨论】:

  • 谢谢!也很抱歉,不能投票!是的,我还需要对不同的线程机制进行更多研究。直到现在才真正需要使用它们。您是否碰巧知道可以让我在这些方面领先一步的资源?
  • @Harsh 我认为 android doc 的 developer.android.com/training/multiple-threads/index.html 的多线程是一个好的开始。
【解决方案2】:

我更喜欢使用对 run() 方法的调用来启动 Runnable。

好的。

如果直接调用 run(),我可能会遇到什么麻烦!

第一次通过run() 会立即发生,而不是注释掉的代码,这将导致第一次通过run() 发生在大约 1000 毫秒后。

但是,我会转储 HandlerpostDelayed() 也是 View 上的一个方法,所以只需在你的 UI 中使用一些小部件。

【讨论】:

  • 谢谢!.. :) 此外,此代码是服务的一部分。所以,我必须使用处理程序并且不能使用 UI 小部件。对吧?..
  • @Harsh:如果这是服务的一部分,您应该使用标准 Java 中的ScheduledExecutorService,或者可能是TimerTask。您特别希望该服务能够定期在后台线程上获得控制权,而这些可以为您提供。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-17
  • 2022-11-21
  • 2011-04-20
  • 2022-10-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多