2

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

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

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

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

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

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

请我不是在寻找使用 ASyncTask 的评论,我想知道我自己如何使用线程,以便线程可以相互通信

4

1 回答 1

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需要Looper例如requestLocationUpdates.

您不需要使用 aHandlerThread来避免(如果您按照您的问题NetworkOnMainThreadException使用,我不知道您是如何获得此异常的)并将它与 一起使用,只需使用普通线程并在方法中执行操作Threadsocketssocketrun

于 2013-02-19T23:07:21.377 回答