【问题标题】:send data from the UI thread to another thread which is not created in by the Main Activity "Android"将数据从 UI 线程发送到不是由主活动“Android”创建的另一个线程
【发布时间】:2014-01-15 21:34:58
【问题描述】:

我查看了几个网站,但没有找到这个问题的答案。

我有一个 UI 线程,它以特定频率调用具有警报管理器的服务。 并且服务本身调用另一个 IntentService,它启动一个服务器/客户端线程。我想知道是否可以让服务器/客户端线程与 UI 线程通信?

非常感谢您的帮助。

【问题讨论】:

  • 您可以将服务绑定到您的活动。

标签: android multithreading service looper


【解决方案1】:

IntentService.onCreate() 方法总是在 UI 线程上执行。您可以在该方法内创建一个新的Handler 实例并将其存储在您的IntentService 实现的实例或类数据成员中。您可以使用此Handlerpost(Runnable) 在UI 线程上执行,或者sendMessage(Message) 将由您的handleMessage(Message) 实现在UI 线程上处理。为简单起见,我建议坚持使用post(Runnable)

根据您的评论更新:

假设您的后台线程自己进行连续处理并且没有looper,最简单的方法是创建一个队列(例如ArrayList<MyLocation>),并将每个新位置添加到它的尾部用户界面线程。同时,后台线程从头部中选择下一个位置并按预期进行处理。这是两个线程之间非常简单的异步通信方式(本质上是LooperMessage 工作方式的简化版本)。

但是,这种方法的主要缺点是您的后台线程总是很忙,因此如果没有传入的位置更新,则会占用 CPU 资源。更好的选择是将您的后台线程更改为 Looper 线程并向其发送消息。这是一个如何Create Looper thread and send a Message to it的示例。

【讨论】:

  • 感谢您的回答。在我的情况下,我在主 Activity 中有一个位置侦听器,当 onlocationchanged() 我想将新位置发送到 IntentService 启动的线程服务器/客户端。如果我的处理程序是在 Intentservice 而不是 UI 线程中创建的,怎么可能?
猜你喜欢
  • 2013-12-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-16
  • 2021-06-08
  • 1970-01-01
相关资源
最近更新 更多