2011-09-23 38 views
2

我想使用HandlerThread类来管理我的应用程序中的线程。以下代码运行良好:HandlerThread应该重写run()吗?

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睡眠(XXX)():

    私人无效美孚(){ // 做一些 睡眠(100); foo(); }

- 使用像一个延迟的消息:

private void foo() 
{ 
    //do something 
    handler.sendEmptyMessageDelayed(1,100); 
} 

PS:的AsyncTask将不包括我的需要,所以也懒得告诉我使用它。

感谢

回答

4

我想你没有得到的HandlerThread的想法。 HandlerThread旨在实现处理消息的线程。这意味着它在其run()方法中使用Looper.loop()(这就是为什么你不应该重写它)。这反过来意味着你不需要睡在onHandleMessage()为了防止线程退出,因为Looper.loop()已经照顾到了这一点。

总结:

  1. 否,不覆盖的run()。
  2. 你不需要做任何事情来保持线程活着。

如果你想学习/多已了解有关HandlerThread,了解LooperHandler类。

+0

好的,所以我的第二个问题的最佳解决方案是使用延迟的消息(不想让线程活着但重复该方法)? – grunk

0

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

如果你的任务本身是无限的,没有任何东西阻止你以这种方式执行它。您可能想要使用handler.sendEmptyMessageDelayed的唯一原因是,如果您计划在执行foo()时让其他任务在HandlerThread上排队。您推荐的另一种方法将阻止HandlerThread处理任何其他消息。话虽如此,我怀疑有一个更好的方法可以让你的任务无限。最后,你应该记住停止你的无限任务并且调用HandlerThread.getLooper()。quit()来确保你的HandlerThread很好地停止。

相关问题