0

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

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

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

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

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

4

1 回答 1

2

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

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

下一部分在 Android 中显然很困难

不是特别。

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

仅当您想为此使用 aHandler时。

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

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

于 2013-05-02T18:34:15.953 回答