gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 11:35:44 25 4
gpt4 key购买 nike

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

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

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

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

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

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

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

最佳答案

HandlerThread 视为具有 Looper 等待消息执行的工作线程(可以生成新的 Thread)。因此,要与它通信,只需准备一个 Message 对象并将其分派(dispatch)给处理程序(例如,您可以启动一个新的 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,我不知道如何获得此异常根据您的问题)并将其与套接字一起使用,只需使用普通线程并在run方法中执行您的socket操作

关于java - 如何正确使用带套接字的 HandlerThread?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14969285/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com