如何正确使用HandlerThread与套接字?

时间:2013-02-19 23:03:02

标签: java android multithreading sockets looper

我一直在看HandlerThread类,因为我最初使用的是一个简单的线程和处理程序,但在android中出现了一个带有NetworkOnMainThreadException的裁剪器。

我似乎无法理解如何将套接字之类的东西引入HandlerThread,这是你将阻塞代码放入运行的地方。但你不能用HandlerThread做到这一点,因为你不应该覆盖run,因为那就是looper。

我无法通过消息调用HandlerThread来开始侦听套接字,因为它会阻止传递给它的任何其他消息。

这个HandlerThread类是否设计用于非阻塞的任务?因为我似乎无法理解如何使用这样的线程,所以它可以侦听套接字,但可以处理请求就像我从主UI线程创建一个普通线程一样

我可以在正常的线程中,在运行中调用Looper.prepare()和Looper.loop(),然后将代码放在这两行之间(通过检查来创建处理程序)但是我遇到了问题与此新线程通信时,消息不会传递到线程中。

那么我该如何创建可以使用处理程序相互通信并正在执行诸如使用套接字之类的任务的线程。

请不要使用ASyncTask注释,我想知道自己如何使用线程,因此线程可以相互通信

1 个答案:

答案 0 :(得分:1)

HandlerThread视为具有Looper等待消息执行的工作线程(可以生成新的Thread)。因此,要与它进行通信,只需准备一个Message对象并将其发送给处理程序(例如,您可以为套接字读取启动一个新的thread,例如。

Handler handler = new Handler(handlerThread.getLooper()){
   @Override
   public void handleMessage(Message msg) {
      // Do action based on this message
   }
}

通常情况HandlerThread在您收听需要events的{​​{1}} Looper时非常方便requestLocationUpdates

您不需要使用HandlerThread来避免NetworkOnMainThreadException(如果根据您的问题使用Thread,我不知道您是如何得到此异常的)并使用它使用sockets,只需使用普通线程并在socket方法中执行run操作