【问题标题】:Android Runnable and handler on main UI Thread主 UI 线程上的 Android Runnable 和处理程序
【发布时间】:2013-01-03 17:13:21
【问题描述】:

关于 Java Andriod 处理程序:

handler.post(new Runnable(){
    public void run() {
        // do stuff
    }
});

据我了解,这将在处理程序实例化的任何线程上运行。所以让我们说在Android中我在主线程上实例化处理程序,那么我的问题是runnable有什么意义?您将任务添加到主 UI 线程的消息队列中,为什么不跳过可运行并创建一个方法,因为您已经在主线程上。我见过程序员这样做,我想知道为什么?

我知道我们可以做Thread genThread = new Thread(new myRunnable());,但我想知道主线程上是否有 Runnable 的任何值。

【问题讨论】:

  • handler.post 可以从任何线程调用,即使它是在 ui 线程上实例化的。
  • 在资源和性能方面,使用 handler.obtainMessage() 和 .sendMessage 比每次动态创建一个新的可运行对象要好得多。

标签: java android thread-safety runnable


【解决方案1】:

有时您想运行一些代码,但又不希望它立即运行,您想推迟它。根据我的经验,最常见的用途之一是当您处于布局阶段并且您希望在布局阶段完成后“排队”发生一些事情。为此,您只需将 Runnable 发布到 UI 线程的消息队列,它将被放在消息队列的末尾……这正是您想要的位置。

另一个常见的用例是如果您想从 onCreate 中找出视图的大小。在 onCreate 中,视图尚未测量,因此这不起作用:

Log.d(TAG, view.getWidth());

您可以这样做:

view.post(new Runnable() {public void run() {Log.d(TAG, view.getWidth());}}) ;

【讨论】:

    【解决方案2】:

    我建议使用 AsyncTask 而不是 Handlers,因为它们更容易理解并且代码更简洁。我知道我正在转移发布的原始问题,但这只是一个建议。如果您想了解更多关于 AsyncTask 的信息,请点击以下链接。

    AsyncTask

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-01-24
      • 2020-02-03
      • 2020-10-09
      • 2013-04-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多