【问题标题】:Android: What happens after a HandlerThread is started?Android:启动 HandlerThread 后会发生什么?
【发布时间】:2015-07-29 19:13:58
【问题描述】:
HandlerThread thread = new HandlerThread("DownloadService");
thread.start();

looper 是否与等待消息到达消息队列的线程相关联,只是thread.start() 返回?如果是这样,那么我需要做的就是将这个线程的looper与一个实现handleMessage()的类关联起来。这会是正确的实现吗?

【问题讨论】:

  • 是的,创建一个与该 Looper 关联的 Handler

标签: android android-handler android-handlerthread


【解决方案1】:

在thread.start()返回后,looper是否与等待消息到达消息队列的线程相关联?

Not necessarilystart() 只创建一个线程,该线程将在未来的某个时候创建​​一个Looperstart() 本身不会等待弯针准备好。

编辑:但是,这通常不是问题,因为HandlerThread.getLooper() 将等待弯针准备好(如果它还没有准备好)。

旁注:我认为HandlerThread 不是一个命名良好的类,因为它实际上只创建了一个Looper

【讨论】:

  • 不,它 Thread(HandlerThread 扩展线程),也不需要覆盖onLooperPrepared 参见:androidxref.com/4.4_r1/xref/frameworks/base/core/java/android/…
  • 我不是在抱怨Thread,我是在抱怨Handler,因为HandlerThread 不会以任何方式直接接触HandlerLooperThread 会更好, 可能是)。另外:请阅读OP的问题。 start() 返回和在不同线程中附加处理程序之间存在竞争条件,因为当您尝试将处理程序附加到它时,HandlerThread 可能还没有 Looper
  • 只需调用:ht.start(); handler = new Handler(ht.getLooper()),就是这样
  • 再重复一遍:当您调用start() 时,不能保证Looper 已经创建,因为Looper 是在HandlerThread 中异步创建的。然而getLooper() 等待looper 准备好。
  • 我已经做到了:查看我发布的链接,它显示了 getLooper() 源代码,那么new Handler(ht.getLooper()) 有什么问题,因为getLooper() 是一种阻塞方法?
猜你喜欢
  • 1970-01-01
  • 2016-01-06
  • 1970-01-01
  • 2012-12-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-20
相关资源
最近更新 更多