Android工作线程有自己的Handler / Looper

时间:2013-05-02 18:25:44

标签: android multithreading handler looper

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

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

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

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

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

1 个答案:

答案 0 :(得分:2)

  

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

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

  

Android的下一部分显然很难

不是特别。

  

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

仅当您想使用Handler时。

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

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