Необходимо выйти из HandlerThread? - PullRequest
10 голосов
/ 01 июля 2011

Мое приложение использует HandlerThread для нескольких операций, совместно используемых компонентами, которые должны выполняться в фоновом потоке. Большую часть времени этот поток будет в состоянии ожидания.

Могу ли я оставить этот HandlerThread работающим (ожидающим) в моем приложении, посылая ему сообщения при необходимости, но никогда не выходя из него через HandlerThread.getLooper().quit()? Это может означать, что HandlerThread будет продолжать существовать в состоянии ожидания даже после того, как все компоненты моего приложения будут уничтожены.

Изначально это казалось мне большим отказом - что-то, чего я определенно не хотел бы делать - но сейчас я не уверен. Когда Android убивает мой процесс, как это происходит, когда ему нужно освободить процессорное время или память, он завершает этот поток вместе с моим потоком пользовательского интерфейса. Кроме того, поток будет ожидать, поэтому он не будет занимать процессорное время. Кроме того, мое приложение использует множество AsyncTasks, которые, как я знаю, используют пул потоков. Насколько я понимаю, AsyncTask использует ThreadPoolExecutor, который не привязан ни к каким обратным вызовам жизненного цикла приложения (потоки в пуле, когда они не используются, просто ждут).

Итак, мой вопрос: могу ли я использовать HandlerThread для нескольких компонентов приложения, никогда (или редко) выходить из него и оставлять его в ожидании, когда он не используется, без каких-либо ужасных побочных эффектов?

1 Ответ

0 голосов
/ 08 июля 2011

Мое личное предпочтение - создавать новую ветку всякий раз, когда в этом есть необходимость, и очищать ее, когда она закончится. Таким образом, у меня нет проблем с несколькими компонентами, пытающимися использовать один и тот же поток одновременно, и я сохраняю «чистую судьбу». Также у Android есть приятная AsyncTask , которая делает это легким для вас.

При этом я не вижу причин, по которым вы не можете повторно использовать свою обработчик для нескольких компонентов, если вы регулируете доступ к потоку И очищаете его должным образом, когда ваши действия уничтожены. Если я правильно понимаю этот пост , ваш поток может продолжаться, даже если все ваши действия будут прекращены, потому что ваш процесс может продолжаться. Чтобы решить эту проблему, вы можете установить свой поток как поток демона. Потоки демона автоматически уничтожаются по завершении последнего потока, не являющегося демоном, в вашем приложении.

Кстати, в качестве альтернативы вы также можете рассмотреть возможность использования ThreadPoolExecutor

...