Intereting Posts
Получение HTTP-ответа POST-ответа из файла PHP (отправка POSTS работает нормально, это получение, которое я не могу понять) Проблемы с запуском файла Android APK при слиянии файлов dex с помощью Scala Ошибка EditText? Дублированное текстовое содержимое при первом вращении? Как отправить данные из BroadcastReceiver в Activity в android? Передача токена доступа Facebook к плагину комментариев из собственного приложения BitmapFactory.decodeStream (InputStream is) возвращает значение null для non null InputStream на Android Geofencing: Ошибка HTTP-запроса при отправке через фоновый сервис. Дает UnknownHostException Как изменить размер шрифта во время печати в android? Разница между «размером экрана» и «плотностью экрана» в Android? Не удалось нормализовать путь для файла «E: \ WorkSpace \ mapdemo \ app \ build \ intermediates \ mockable-Google Inc.: API Google: 21.jar ' Дисплей Android MapView пуст Создание стилей-v21.xml Как программно удалить PreferenceCategory? Хранить файлы после удаления приложения для Android Установка целевого почтового адреса в Firebase Invites

Это префектный способ остановить 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 .