【问题标题】:BlockingQueue on main Service thread主服务线程上的 BlockingQueue
【发布时间】:2014-08-14 21:33:29
【问题描述】:

我的 android 应用程序有一个长时间运行的后台服务,我也知道它在应用程序的主线程中运行,因此,任何耗时或阻塞的任务都应移至单独的线程。

现在,情况是这样,我不明白/感到困惑:

当我从活动绑定到服务时,我会收到对服务的引用,它允许我从活动中调用服务方法。其中一种方法允许我将一个字符串对象从活动传递给服务,然后将其添加到BlockingQueue。在服务的 onCreate 方法中启动的单独工作线程检查队列中的可用数据,然后执行所需的任务。

我想了解的是,如果在某个时候队列变满并且尝试队列阻塞,它会影响服务正在运行的主线程吗?

【问题讨论】:

  • 你为什么使用BlockingQueue?你对制片人有什么要求吗?我的意思是,队列已满和生产者 bean 阻塞的情况是您想要的,还是不想要的副作用?
  • 将对象添加到队列中很重要。因此,如果队列已满,它应该阻塞,直到有可用空间来添加对象。
  • 所以你已经有了一些生产者-消费者模型。为什么生产者首先在主线程上运行?
  • 实际数据来自Activity中的字段,通过调用服务实例上的方法,然后将数据对象作为参数传递给服务中的队列。然后该方法将对象添加到消费线程从中获取对象的队列中。

标签: java android multithreading android-service blockingqueue


【解决方案1】:

是的。在这种情况下,如果队列已满,调用线程将阻塞(在您的情况下,主线程)。所以这是一个糟糕的设计。

来自Activity 字段的生成数据不会强迫您在主线程上使用它。我建议您使用一些Handler 来让您的生产者在自己的线程上运行,这将允许您在主线程之外进行处理(并最终在队列中等待)。

这对于与您的Service 通信也很有用,因为您可以使用HandlersService 通信(请参阅Android Services' guide)。

最后,如果应用生成的数据可以使用 Handler.post(Runnable)Handler.send(Message) 直接传递给Handler

【讨论】:

  • 非常感谢专家的建议。正是我需要的。我知道我实施它的方式肯定有问题。谢谢。
猜你喜欢
  • 2014-02-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-02
  • 1970-01-01
  • 2017-11-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多