当前位置: 首页 > 知识库问答 >
问题:

如何正确使用带有套接字的HandlerThread?

锺离声
2023-03-14

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

我似乎无法理解如何将套接字之类的东西引入到HandlerThread中,您可以在其中运行阻塞代码。但是您不能使用HandlerThread来实现这一点,因为您不应该覆盖run,因为这是循环器所在的位置。

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

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

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

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

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

共有1个答案

亢奇
2023-03-14

HandlerThread 想象成一个工作线程,它有一个循环器等待消息执行(它可以生成一个新线程)。因此,要与它进行通信,只需准备一个Message对象并将其分派给处理程序(例如,您可以启动一个新线程进行套接字读取),例如

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

通常,当您监听需要Looper事件时,HandlerThread很方便,例如Request estLocationUpdate

你不需要使用HandlerThread来避免NetworkOnMainThreadException(我不知道你如何得到这个异常,如果你按照你的问题使用Thread),并把它与套接字一起使用,只需使用一个普通的线程,并在run方法中做你的套接字操作

 类似资料:
  • 我正在尝试在使用用Python编写的套接字服务器与使用Flutter Web制作的客户端之间建立连接。 我测试了各种套接字包,如adhara_socket_io和flutter_socket_io,但都不起作用。我在Android上尝试了相同的代码片段,但它们也不起作用。 我继续搜索,找到了这个代码片段。它使用包中的类。 这个连接到Python服务器,并从Android发送数据,但当我从Web测试

  • 我目前有一个简单的即时消息程序,它利用Java的Socket和ServerSocket类。它按预期运行,但当我尝试关闭连接时,它没有使用4路握手TCP断开来关闭连接。相反,它使用RST数据包突然关闭连接。 关闭连接的方法是从客户端向服务器发送一个字符串,服务器将把它识别为关闭连接的命令。然后,我在服务器上使用方法,在客户端上使用方法。 使用这些类正确关闭TCP连接的正确方式和/或事件顺序是什么?

  • 我使用来管理服务器端的套接字连接。如果服务器(tomcat)关闭,我如何确保任何活动的套接字连接被正确终止? 有好心的听众吗?或任何可以防止服务器关闭的拦截器,例如,如果在关闭期间有任何打开的套接字,则最多60秒;但同时关闭套接字,在关机期间不接受任何连接?

  • 问题内容: 我有一个包含数字的字符串列表,但找不到找到对它们进行排序的好方法。 例如,我得到这样的东西: 用的方法。 我知道我可能需要以某种方式提取数字,然后对列表进行排序,但是我不知道如何以最简单的方式进行操作。 问题答案: 也许您正在寻找人工排序(也称为自然排序): 产量 PS。我已经更改了答案,以使用Toothy的自然排序实现(在此处发表评论),因为它比我的原始答案快得多。 如果您希望使用浮

  • 问题内容: 在尝试学习TDD的过程中,尝试学习单元测试并在python中使用模拟。慢慢掌握它,但不确定我是否正确执行此操作。预先警告:由于供应商API是预编译的2.4 pyc文件,因此我正在使用python 2.4进行卡住,因此我正在使用模拟0.8.0和unittest(不是unittest2) 在“ mymodule.py”中给出此示例代码 现在在我的测试用例文件“ test_myclass.p