如何在Handler / Thread中实现自己的循环?

时间:2014-04-30 13:26:06

标签: java android multithreading loops handler

经过大量关于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线程接收(和发送)消息。

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

提前感谢。

2 个答案:

答案 0 :(得分:0)

如果在UI线程中运行while循环,UI将无响应。这就是把这些工作转移到其他线程的全部理由。

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

现在,您应该做的是依赖于您要解决的问题。那里 在android中进行后台工作的很多机制,在它们之间进行选择并不容易 如果我们对你所面临的问题一无所知。

-edit回应评论 -

我对我的安卓线程设计技巧没有信心,所以采取我即将建议的内容 带着一粒盐。

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

在Android中正常的java处理线程也很完美 当你这样做时,你会遇到所有常见的同步问题,加上一大堆 由于你必须处理的活动生命周期的东西,弹出更多。

答案 1 :(得分:0)

Looper,HandlerThread和所有相关类都基于Java线程系统,它们都是开源的。您可以根据需要获取源代码并对其进行修改(例如,您可以找到Looper代码here

但正如他们在其他答案中所说,我不认为这是一个好主意。您应该能够使用Looper和HandlerThread的当前实现轻松地完成所需的操作。您提到的要求对我来说并不清楚,所以我不确定您为什么要使用自定义Looper。