【问题标题】:How to implement my own loop in a Handler/Thread?如何在处理程序/线程中实现我自己的循环?
【发布时间】:2014-04-30 13:26:06
【问题描述】:

在对 Threads 和 HandlerThreads 进行大量调查后,我找不到我需要的东西。 我需要将消息从我的 UI 线程发送到另一个线程,我发现 HandlerThread 可能是解决方案,但我需要使用 MY OWN 循环而不是标准 Looper.loop():

class Worker extends Thread {
    public Handler handler;
    public void run() {
        Looper.prepare();
        mHandler = new Handler() {
            public void handleMessage(Message msg) {
                // ...
            }
        };
        Looper.loop(); <<<<<< how to implement my own "while()" loop ??
    }
}

这是因为,它需要我自己的“while”循环来做一些工作,并且我需要同时从 UI 线程接收(和发送)消息。

还有其他方法可以实现所有这些吗?

提前致谢。

【问题讨论】:

  • 你在使用图书馆吗? Looper 不是标准 Java 的一部分。
  • 它是 Android api 的一部分。

标签: java android multithreading loops handler


【解决方案1】:

Looper、HandlerThread 以及所有相关类都是基于 Java Threading 系统的,并且都是开源的。您可以获取源代码并根据需要进行修改(例如,您可以找到 Looper 代码here

但正如他们在其他答案中所说的那样,我认为这不是一个好主意。使用 Looper 和 HandlerThread 的当前实现,您应该能够轻松地做您需要的事情。你提到的要求我不清楚,所以我仍然不确定你为什么要使用自定义 Looper。

【讨论】:

    【解决方案2】:

    如果您在 UI 线程中运行 while 循环,则 UI 将变得无响应。这就是将此类工作转移到其他线程的全部原因。

    Handler/Looper 是一种访问正确同步的消息队列的方法 关联到一个线程。这是线程之间通信的好方法,而不是一种机制 在一个线程中同时做两件事。

    现在,您应该做什么取决于您要解决的问题。那里 有很多机制可以在 android 中进行后台工作,并且在它们之间进行选择并不容易 如果我们不知道您面临的问题。

    -根据评论进行编辑-

    我对自己的 android 线程设计技能没有信心,所以请接受我将要提出的建议 一粒盐。

    我的建议是实现您的处理程序线程。取while循环的主体 并将其实现为可运行的,最有可能作为处理程序中的内部类或其他东西 相似的。 runnable 应该做的最后一件事是将自己发布到处理程序。这 handler 还应该有 handleMessage 方法来处理来自 UI 的任何消息 线。这里的想法是处理程序线程的循环器将交错 可运行和消息的处理,但是因为两者都发生在同一个线程中 您将不需要任何额外的同步。您还需要发布一次可运行文件 在你启动 looper 之前从 handlerThread 的 run 方法。

    在 android 中以普通的 java 方式处理线程也很好,但是 当你这样做时,你会遇到所有常见的同步问题,再加上一大堆 由于您必须处理活动生命周期的内容,因此会弹出更多内容。

    【讨论】:

    • 感谢您的回答,我认为我的问题的解决方案应该比我之前所说的更简单。我想做的是一个辅助线程运行我自己的“无限”循环(用一段时间实现),做很多事情。现在我需要将消息从主 UI 线程发送到该辅助线程,使用 Handler 可能是?据我所见,使用 HandlerThread 可能是解决方案,但在这种情况下,我无法实现自己的“无限”循环,因为我有一个 Lopper.loop() 代替。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-04-08
    • 1970-01-01
    • 1970-01-01
    • 2014-04-23
    • 1970-01-01
    • 1970-01-01
    • 2013-01-28
    相关资源
    最近更新 更多