【问题标题】:Looper or while in a thread?Looper 还是在线程中?
【发布时间】:2018-05-20 12:12:22
【问题描述】:

我正在尝试理解 Looper...

这一次我有点困惑,因为我(直到现在)只使用了 while(true) 条件来将线程保持在无限循环中。

我只想知道使用 Looper 或 while(true) 条件是否更好。

我在互联网上搜索了我的问题的可能答案,但我对找到同时使用 Looper 和 while(true) 的代码感到非常失望。

可能我没有明白使用 Looper 的意义,但是,你知道,我们是来学习的……不是吗?

【问题讨论】:

  • 几天前我在这里研究多线程,遇到了这个答案和这个讲座。答案 - stackoverflow.com/a/29655572/2104990 讲座 - youtube.com/… 文档 - developer.android.com/topic/performance/threads.html 在这种情况下,这肯定是一项艰巨的任务,但这些应该可以帮助您
  • 这些文档讲了handler thread asynctask和handlerthread的区别。也许我无法传达我的问题的目的。我想了解使用 Looper 类是否比在 Thread 类的 run 方法中使用 while(true) 条件更好...正如我在互联网上看到的 (blog.mindorks.com/…) 我可以使用 Looper 在队列中启动可运行对象.它比使用 while(true) 条件更好吗?如果是,为什么?我们必须结合使用它们吗?如果是,为什么?
  • 不是重复的,DeeV 完全理解了这一点。

标签: android multithreading


【解决方案1】:

Looper 是一种保持线程开放以处理通过Handler 发送给它的Messages 的机制。从这个意义上说,它们与while(true) 相似,因为线程永远保持打开状态(或者在这种情况下,直到您明确告诉它关闭)。但是,与while(true) 不同,您可以从另一个线程向它发送消息。每次创建Handler 时,它都会将自己绑定到创建它的Looper 线程。然后,每次您向该Handler 发布消息时,它都会在创建它的线程上处理该消息.

Android 中最常见、最知名的 Looper 线程是主 UI 线程。这个线程一直在运行。它运行发布到它的代码。最常见的绘图操作,但如果您查看并调用View#post,它将在下一个绘图周期中运行代码。这是因为所有View 对象都有一个Handler,它是在主UI Looper 线程上构建的。

UI Looper 实际上可以引用Looper.getMainLooper() 方法,您可以创建一个Handler 将消息发布到此线程,如下所示:new Handler(Looper.getMainLooper());

如果您需要,您可以创建自己的Looper 线程,作为 UI 线程的并行线程。您不能对其进行绘图操作,但可以将其用作其他操作的工作线程。这样一来,您就无需在每次需要执行密集操作时都创建新线程的开销。

【讨论】:

  • 这是我一直在寻找的答案,谢谢@DeeV。你能说一下在某些情况下(至少一个)同时使用 Looper 和 while(true) 是有意义的吗?
  • @AndreaZedda 没有。没有必要同时使用两者。 Looper 更强大,所以我建议在while(true) 上使用它。
  • @AndreaZedda looper 结构良好,可以替代您使用 while(true) 所做的操作
  • 好的,您的两个答案对我都非常有帮助,它们肯定会引起反思。我怀疑只是因为我看到其他人(谈论类似的话题)一起使用它们。总之谢谢!! :) 你成就了我的一天
【解决方案2】:

我只是想知道是使用 Looper 条件还是 while(true) 条件更好。

我想说,作为一般规则,除非您需要一些非常具体的低级控制,否则使用框架提供的 API,无论框架是什么。

它们通常会处理许多原本需要您自己实现它们的方面,例如消息传递、任务删除等等......

我猜想通过while (true) 循环,您正在尝试实现一些常规任务重复。

在这种特殊情况下,是的,使用 Handler 和它自己的 Looper,这样 UI 线程不会被阻塞,并定期使用 postDelay(Runnable, long) 发布您的 Runnable 实例。

@DeeV 的回答已经让您对上述组件有了很好的理解,但您肯定会在 Android 文档中找到所需的一切。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-09-17
    • 1970-01-01
    • 2012-01-16
    • 2012-02-04
    • 1970-01-01
    • 1970-01-01
    • 2013-11-15
    • 2014-04-19
    相关资源
    最近更新 更多