Android: что происходит после запуска HandlerThread?

HandlerThread thread = new HandlerThread("DownloadService");
thread.start();

Связан ли зацикливатель с потоком, ожидающим прибытия сообщения в очередь сообщений сразу после того, как thread.start() завершит работу? Если это так, то все, что мне нужно сделать, это связать цикл этого потока с классом, который реализует handleMessage(). Будет ли это правильной реализацией?


person Amit    schedule 18.05.2015    source источник
comment
да, создайте обработчик, связанный с этим Looper   -  person pskink    schedule 18.05.2015


Ответы (1)


Связан ли петлитель с потоком, ожидающим прибытия сообщения в очередь сообщений сразу после возврата thread.start()?

Не обязательно. start() только создает поток, который -- в какой-то момент в будущем -- создаст Looper. start() сам не ждет готовности лупера.

Редактировать: Однако обычно это не проблема, так как HandlerThread.getLooper() будет ждать, пока лупер не будет должным образом подготовлен, если он еще не готов.

Боковое примечание: я думаю, что HandlerThread не является классом с хорошим именем, поскольку на самом деле он создает только класс Looper.

person dhke    schedule 18.05.2015
comment
Я не жалуюсь на Thread, я жалуюсь на Handler, поскольку HandlerThread никоим образом напрямую не касается Handler (возможно, LooperThread было бы лучше). Также: прочитайте вопрос ОП, пожалуйста. Существует состояние гонки между возвратом start() и присоединением обработчика в другом потоке, поскольку Looper для HandlerThread может еще не быть, когда вы пытаетесь присоединить к нему обработчик. - person dhke; 18.05.2015
comment
просто вызовите: ht.start(); обработчик = новый обработчик (ht.getLooper()), вот и все - person pskink; 18.05.2015
comment
Повторюсь: нет никакой гарантии, что Looper уже создан, когда вы вызываете start(), потому что Looper создается асинхронно в HandlerThread. Однако getLooper() ждет готовности лупера. - person dhke; 18.05.2015
comment
я уже сделал это: см. ссылку, которую я разместил, она показывает исходный код getLooper(), так что не так в new Handler(ht.getLooper()), поскольку getLooper() является методом блокировки? - person pskink; 18.05.2015
comment
Вы правы насчет getLooper(), см. отредактированный ответ. OP по-прежнему спрашивает, готов ли петлитель сразу после start(), что не так. Он готов после getLooper(), потому что getLooper() его явно ожидает. Простое удаление ссылок на исходный код не является объяснением в моей книге. - person dhke; 18.05.2015
comment
ну, есть только один способ получить Looper HandlerThread, и это метод getLooper(), поэтому OP все равно должен вызвать его, чтобы убедиться, что Looper готов - person pskink; 18.05.2015