首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带有队列的Android线程与Handler/Looper:哪一个是有效的?

带有队列的Android线程与Handler/Looper:哪一个是有效的?
EN

Stack Overflow用户
提问于 2014-02-09 21:04:10
回答 2查看 1.1K关注 0票数 2

我有一个生产者-消费者的情况,我想决定在两种机制之间实现它。这是一种音频记录/编码的情况:生产者连续轮询设备麦克风,以获取录制的音频,当音频样本可用时,将该示例传递给作为编码器的使用者,以进行编码和保存。

现有的两个机制是:

  1. 两个具有队列的线程将消息从生产者传递给使用者。
  2. 或者,使用Handler作为使用者,当消息可用时,由生产者发布消息。

但是,我不知道哪一个更有效率:

如果两个线程与一个队列一起使用,那么使用者必须在with循环中运行。例如,如果任务持续5分钟,则此循环必须运行5分钟。虽然,如果使用Handler,我的理解是,处理程序(使用者)只在有消息时才运行,当调用它的handleMessage方法时。(关于处理程序如何工作的假设是否为真,即它不会在连续循环中运行?)。因此,我的结论是,在这方面,处理程序更有效。

但是,另一方面,与Handler的消息传递机制相比,队列似乎是更简单的机制,可能需要更少的工作,而Handler的消息传递机制在每条消息上都会重复(同样,这种假设是真的吗?)

现在,基于上述两种假设(在我看来,这两种假设似乎相互矛盾),我不确定这两种机制中哪一种更有效。

注意:我没有发布任何代码,因为,我认为这是一个通用的情况。

谢谢。

编辑:

在实现方面,这两种机制的实现相对简单。我的问题是关于两种机制的运行时行为。因为,我至少有5个线程,其中每个线程都是连续运行的关键。现在,我的问题是,在这种情况下,这两个选项中哪一个更好(特别是对于Android应用程序,考虑到处理程序、Loopers和HandlerThread是如何工作的)?

  1. 实现N个线程,每个线程运行在一个while循环中。通信机制比较简单,一个队列。但N个并发循环。
  2. 将生产者实现为在循环中运行,而使用者实现为处理程序。不是N个并发循环(至少在表面上,在所看到的后面可能是这样),而是一个更复杂的通信:货品计价线程消息队列、活套机制、特殊消息传递等等。
EN

回答 2

Stack Overflow用户

发布于 2014-02-09 21:26:51

在我看来,第二种方法会更好地工作,因为您的论点:您将不得不一直运行一个循环,即使这是在线程内运行,最后这些都是您浪费的资源,在处理该音频的昂贵操作中,您将非常感激。可以通过setPriority(...)调整线程优先级来弥补这一不足,尽管它是在玩和测量性能。

另一方面,Handler方法将本机决定何时调用使用者进程,以及何时调用,因此您将获得第一个线程所需的资源。所以,即使这可能更难实现,我还是会这么做的。

票数 0
EN

Stack Overflow用户

发布于 2014-02-09 21:39:50

处理程序使用线程执行:

http://developer.android.com/reference/android/os/Handler.html

您将仅限于实现它的代码的效率。但是,除非您确信您了解线程实现与处理程序实现的低层次细节,否则定制线程很可能效率较低。

换句话说,对于一般实现,这里没有明确的答案。这是特定的案例和开发人员。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21665015

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档