【问题标题】:How to correctly use the HandlerThread with a socket?如何正确使用带有套接字的 HandlerThread?
【发布时间】:2013-02-20 07:18:23
【问题描述】:

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

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

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

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

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

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

拜托我不是在寻找使用 ASyncTask cmets,我想知道我自己如何使用线程,以便线程可以相互通信

【问题讨论】:

  • 我做了一些更多的测试,在一个单独的项目中与andengine。在 OnCreate 中,我使用 onRunUIThread 创建主类处理程序,然后使用 onRunUIThread 再次创建线程。然后如果该线程创建另一个线程,新的内部线程应该调用 looper。它似乎工作正常,所以不知道为什么我会收到 NetworkOnMainThreadException,因为新项目具有相同的目标并且在同一部手机上,这有点令人费解。

标签: java android multithreading sockets looper


【解决方案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 在您收听需要Looperevents 时很方便,例如requestLocationUpdates.

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

【讨论】:

  • NetworkOnMainThreadException 的出现是因为为了让普通线程循环,它需要更新也称为 looper,因此在 ui 线程上创建和启动会为您设置 looper。但是发布蜂窝你不能这样做,所以你自己做活套或使用处理程序线程。正常线程我无法发送消息,尽管有它的处理程序,handlerthread 你不能让代码运行,也不能把代码放在一个方法中,因为它会阻塞线程停止消息。因此传递消息以在套接字上侦听会阻塞,因此传递消息以在套接字上发送将被阻塞。
  • 收听socket 确实不需要 需要Looper,因此您应该在普通的thread. On the other hand, sending a message on Socket can be done via HandlerThread` 中进行,因为它不会阻塞为读取操作。我不确定你到底想做什么,但我不明白为什么你需要 Looper 来读取 socket
  • 抱歉,在正常的 android Activity 中似乎没问题。但是,我正在使用 andengine 所以它的 opengl 线程,所以这就是导致问题的原因。
猜你喜欢
  • 1970-01-01
  • 2016-08-30
  • 1970-01-01
  • 1970-01-01
  • 2015-12-19
  • 2019-05-05
  • 1970-01-01
  • 2018-04-15
  • 1970-01-01
相关资源
最近更新 更多