我应该覆盖runlerThread run()?

时间:2011-09-23 14:01:15

标签: android multithreading handler

我正在尝试使用HandlerThread类来管理我的应用程序中的线程。以下代码非常有用:

public class ThreadA extends HandlerThread
{
    private void foo()
    {
        //do something
    }

    private void bar()
    {
        //Do something else
    }

    @Override
    public boolean handleMessage(Message msg) {
        switch(msg.what)
        {
            case 1:
            {
                this.foo();
                break;
            }

            case 2:
            {
                this.bar();
                break;
            }
        }
        return false;
    }

    @Override
    protected void onLooperPrepared()
    {
        super.onLooperPrepared();
        synchronized (this) {
            this.AHandler = new Handler(getLooper(),this);
            notifyAll();
        }
    }
}

1-我应该覆盖run()方法吗?在“经典”线程中,大多数代码都位于run方法中。

2-让我们想象一下,我需要我的foo()方法是一个无限的过程(例如获取视频流)。 什么是最好的解决方案?

  • 使用我的foo()代码覆盖运行?
  • 只需在foo()中添加sleep(xxx):

    private void foo()     {         //做一点事         睡眠(100);         FOO();     }

- 使用延迟消息,如:

private void foo()
{
    //do something
    handler.sendEmptyMessageDelayed(1,100);
}
PS:Asynctask不能满足我的需要,所以不要费心告诉我使用它。

由于

2 个答案:

答案 0 :(得分:4)

我认为你没有得到HandlerThread的想法。 HandlerThread旨在实现处理消息的线程。这意味着它在Looper.loop()方法中使用run()(这就是你不应该覆盖它的原因)。这反过来意味着您不需要在onHandleMessage()中休眠以防止线程退出,因为Looper.loop()已经处理了此问题。

总结:

  1. 不,不要覆盖run()。
  2. 你不需要做任何事情来保持线程活着。
  3. 如果您想了解更多关于HandlerThread的信息,请阅读LooperHandler课程。

答案 1 :(得分:0)

您不应该覆盖HandlerThread中的run方法,因为这是该类的核心功能实际发生的地方。根据你所展示的内容,我也认为没有理由这样做。

如果你的任务本身是无限的,那么没有什么能阻止你以这种方式执行它。您可能希望使用handler.sendEmptyMessageDelayed的唯一原因是,如果您计划在foo()执行时让其他任务在HandlerThread上运行。您建议的另一种方法将阻止HandlerThread处理任何其他消息。话虽如此,我怀疑有更好的方法让你的任务无限。

最后,你应该记住停止你的无限任务并调用HandlerThread.getLooper()。quit()以确保你的HandlerThread很好地停止。