【问题标题】:Android worker thread with its own Handler/Looper具有自己的 Handler/Looper 的 Android 工作线程
【发布时间】:2013-05-03 03:03:49
【问题描述】:

我想要一个工作线程,它可以 1) 向 UI 线程发送消息以更改 GUI 中的内容,以及 2) 从 UI 线程接收消息以控制工作线程的行为。

第一部分很简单:在 UI 线程中创建一个 Handler,让工作线程向它发送消息。奇迹般有效。工作线程使用 Thread.sleep() 执行有效延迟,唤醒“做事”,向 UI 线程的 Handler 发送更新,然后重复。

接下来的部分在 Android 中显然很困难。工作线程必须有一个 Looper 才能创建一个 Handler 以便它可以接收消息,并且 Looper.loop() 是一个阻塞调用,这意味着工作线程现在 100% 致力于运行 Looper 并且不能做其他事情当前正在做(“做事”,发送更新消息,睡眠,重复)。

这意味着我需要第三个线程来为工作线程运行 Looper,这很荒谬。应该可以让工作线程做有用的事情,并在消息到达时处理消息。这产生了一个具有最少线程对象和最小开销的高效系统。我不知道如何在 Android 中实现这种行为。

那么...工作线程如何支持 Handler 并做其他有用的事情?谢谢!

【问题讨论】:

    标签: android multithreading handler looper


    【解决方案1】:

    工作线程使用 Thread.sleep() 执行有效延迟,唤醒“做事”,向 UI 线程的 Handler 发送更新,然后重复。

    这可能对您的应用来说是正确的,但由于您决定不描述您的实际业务问题,所以很难说。例如,如果您正在编写一个电子邮件客户端,并且您需要每 15 分钟控制一次以检查新电子邮件,那么您提出的解决方案将是不可靠的。

    接下来的部分在 Android 中显然很困难

    不是特别。

    工作线程必须有一个 Looper 才能创建一个 Handler 以便它可以接收消息

    仅当您想为此使用 Handler 时。

    Java 作为一种编程语言,已经存在了相当长的时间。它有多种线程间通信方式。 HandlerLooperHandlerThread 环绕这些以提供一种特定模式。正如您所指出的,该模式并不适用于所有场景。但是,Java 的其余部分仍然存在,许多标准 Java 类是您可以利用的 Android 的一部分。

    因此,例如,您可以使用LinkedBlockingQueue。让主应用程序线程将命令放入该队列。您的工作线程(而不是使用 sleep())将使用带有超时的 poll() 从队列中拉出事件或在一段时间后唤醒。

    【讨论】:

    • 太好了,这正是我想要的。它让我想起了 Windows 中的完成端口,并带有可选的超时。毫不奇怪,Android 的文档是以 Android 为中心的,所以我没有发现任何提到 LinkedBlockingQueue。我将立即开始 RTFM...谢谢!
    • @AndroidNewbie:“我发现没有提到 LinkedBlockingQueue”——它在 JavaDocs 中。它也在各种 Java 资源中,例如《Java 并发实践》一书。
    • 还有一个问题:Java 原生有几种阻塞队列机制,为什么 Android 不只使用其中一种呢?当有其他几个现有的原生选项时,为什么要创建全新的 Handler/Looper 构造?
    • @AndroidNewbie:“为什么 Android 不只使用其中之一?” -- 性能,早在 Android 瞄准单核 66MHz CPU 的时候。 Handler 专门用于管理 UI 事件队列,在那里,Android 工程师认为同步开销太大。他们向我们公开了Handler,作为我们自己的队列逻辑的一个选项,但它并非设计为通用队列解决方案。
    • “Android 工程师认为同步开销太大”,但 Handler 是专门线程安全的,因此开销以某种方式存在。我想我会把它归结为所有平台都有自己独特的怪异特质这一事实。底线:使用 Handler 与 UI 线程和本机队列对话以处理其他所有问题。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2011-07-16
    • 1970-01-01
    • 1970-01-01
    • 2014-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-14
    相关资源
    最近更新 更多