Это префектный способ остановить handlerthread?

Я всегда создаю два обработчика: один нажимает на основной поток, другой – на один поток.

Является ли это лучшим методом для запуска и остановки в жизненном цикле деятельности?

HandlerThread safeThread = null; Handler safeHandler = null; Handler handler = null; @Override public void onStart() { if (safeThread == null) { safeThread = new HandlerThread("safeThread"); safeThread.start(); safeHandler = new Handler(safeThread.getLooper()); } else if (safeThread.getState() == Thread.State.NEW) { safeThread.start(); safeHandler = new Handler(safeThread.getLooper()); } else if (safeThread.getState() == Thread.State.WAITING) { safeHandler = new Handler(safeThread.getLooper()); } else if (safeThread.getState() == Thread.State.TERMINATED) { safeThread = null; safeThread = new HandlerThread("safeThread"); safeThread.start(); safeHandler = new Handler(safeThread.getLooper()); } } protected void onStop() { Log.d("x", "onStop is executed"); safeHandler = null; safeThread.quit(); safeThread.interrupt(); safeThread = null; super.onStop(); } 

Вы можете использовать это как безопасный способ остановить потоки:

  if (safeThread!= null) { Thread moribund = safeThread; safeThread = null; moribund.interrupt(); } 

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

У HandlerThread есть встроенные методы quit() и quitSafely (API18), чтобы остановить поток. https://developer.android.com/reference/android/os/HandlerThread.html#quit ()

Разница между ними заключается только в том, что сообщения в очереди будут обработаны до их остановки или нет.

Поэтому, чтобы ответить, это так же просто, как:

 safeThread.quit(); 

Если вы начинаете поток следующим образом:

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

Самый безопасный способ остановить это:

 thread.quitSafely(); 

QuitSafely гарантирует, что все ожидающие сообщения обрабатываются до остановки потока.

Примечание. Мой первоначальный ответ включал дополнительный вызов thread.join , но я обнаружил, что вызов соединения не надежно освобождается при использовании после quitSafely .