【问题标题】:Understanding what Looper is about in Android了解 Looper 在 Android 中的含义
【发布时间】:2013-07-03 04:16:40
【问题描述】:

我不得不将 Looper 添加到以下代码中:

public class MyRunnable implements Runnable
{
  @Override
  public void run()
  {
      Looper.prepare();
      final Looper looper = Looper.myLooper();

      new Handler().postDelayed(
          new Runnable()
          {
            @Override
            public void run()
            {
              try
              {
              }
              catch (Exception ex)
              {
              }
              finally
              {
                looper.quit();
              }
            }
          }, 100);

      Looper.loop();
  }
}

请注意,我在 runnable 中有一个 runnable。嵌套的 runnable 通过 Handler 执行。最初我没有 Looper,但 Android 抱怨说我需要在执行另一个线程之前调用 Looper.prepare。

我阅读了 Looper,但它似乎仍然有点神秘。它似乎就像某种内部消息传递管道。我不清楚为什么这是必要的,因为没有消息从我的外部运行到我的内部运行。即使这是真的,Android 似乎只是制定了一个硬性规则,即如果你从一个线程调用一个线程,你也必须调用 Looper.prepare。即使我按原样接受,它仍然无助于理解为什么我需要调用 looper.loop 和 looper.quit。如果我省略 Looper.loop,我的 Handler 永远不会运行,这是不清楚的。 Looper.loop 做了什么让我的 Handler 运行?

【问题讨论】:

  • android: What is the purpose of Looper and how to use it? 的可能副本。是的,如果你想使用 Looper,那么你必须调用 Looper.prepare()。使用 Looper 的替代方法包括仅创建普通(并行)线程或使用 AsyncTasks。阅读我引用的 SO 链接以获得更多背景信息。 '希望对您有所帮助...
  • 有点解释它。我看到的最大问题是将 Runnables 称为“消息”。这些不是传统意义上的编程世界中的“消息”,因为 Runnable 是一段可执行的代码,而不仅仅是包含消息的数据。此外,您指向的示例甚至不包括需要的 looper.quit ,也没有表明 Looper.loop 将无限期地阻塞,直到 looper.quit 被调用。 Looper 应该被定义为一个执行多个 Runnables 的队列。

标签: android handler


【解决方案1】:

我觉得下面的教程对理解looper的概念很有帮助。
Intro to looper and handler

【讨论】:

    【解决方案2】:

    这是一篇很棒的文章。

    Looper and Handler in Android

    它带有一个简单的模式,可以直接理解LoopersHandler 之间的关系。

    在这个架构上,我们看到,在同一个线程中(由大矩形表示),无论您创建多少 handler,它们都会 都使用同一个 Looper,即这个线程唯一的 Looper。

    注意

    Looper 必须是 prepared 以允许关联的处理程序处理 posted messages

    Android 应用程序,更准确地说是 android 应用程序 UI 线程(主线程),已经带有一个准备好的 Looper(mainLooper)。

    这里是Communicating with the UI Thread的方法。

    【讨论】:

      【解决方案3】:

      looper的一个简单概念:

      1. 您创建和运行的每个工作线程都会在执行最后一次操作后结束。

      2. 为了防止线程终止,您可以通过调用Looper.loop() 来启动循环,将其视为while(true){} 语句。在调用Looper.loop() 之前,如果尚未准备好循环,则必须使用Looper.prepare() 准备循环。 要终止循环并结束线程,您需要在 looper 上调用 looper.quit()

      现在是您从 Android 收到的通知:

      当你在线程中创建 Handler 时,它会绑定到创建它的线程上,当你使用这个 Handler 发布 runnable 时,代码会在 Handler 的线程上运行。

      因此,当系统看到您想在绑定到线程的 Handler 上运行一些代码(尤其是未来 100 毫秒)时,一旦它完成调用它建议使用的 post 方法@987654326 就会死掉@ 以防止此线程终止,从而使您能够在仍然存在的线程中正确运行第二个 Runnable。

      【讨论】:

        猜你喜欢
        • 2011-07-16
        • 2011-02-17
        • 2011-10-10
        • 2023-03-30
        • 1970-01-01
        • 2015-07-21
        • 1970-01-01
        • 1970-01-01
        • 2021-04-04
        相关资源
        最近更新 更多