我正在尝试使用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()中添加sleep(xxx):
private void foo() { //做一点事 睡眠(100); FOO(); }
- 使用延迟消息,如:
private void foo()
{
//do something
handler.sendEmptyMessageDelayed(1,100);
}
PS:Asynctask不能满足我的需要,所以不要费心告诉我使用它。
由于
答案 0 :(得分:4)
我认为你没有得到HandlerThread
的想法。 HandlerThread
旨在实现处理消息的线程。这意味着它在Looper.loop()
方法中使用run()
(这就是你不应该覆盖它的原因)。这反过来意味着您不需要在onHandleMessage()
中休眠以防止线程退出,因为Looper.loop()
已经处理了此问题。
总结:
如果您想了解更多关于HandlerThread
的信息,请阅读Looper
和Handler
课程。
答案 1 :(得分:0)
您不应该覆盖HandlerThread中的run方法,因为这是该类的核心功能实际发生的地方。根据你所展示的内容,我也认为没有理由这样做。
如果你的任务本身是无限的,那么没有什么能阻止你以这种方式执行它。您可能希望使用handler.sendEmptyMessageDelayed的唯一原因是,如果您计划在foo()执行时让其他任务在HandlerThread上运行。您建议的另一种方法将阻止HandlerThread处理任何其他消息。话虽如此,我怀疑有更好的方法让你的任务无限。
最后,你应该记住停止你的无限任务并调用HandlerThread.getLooper()。quit()以确保你的HandlerThread很好地停止。