Как остановить обработчик?
У меня есть сомнения.. У меня есть активность в моем приложении. Хотя моя деятельность разрушила обработчик, все еще работающий. Работает ли он на другом процессе, отличном от процесса приложения? Может ли кто-нибудь объяснить, почему он так работает? Можно ли остановить обработчик при удалении активности?
Заранее спасибо.
3 ответа
Как описано в документации
http://developer.android.com/reference/android/os/Handler.html
"Каждый экземпляр обработчика связан с одним потоком и очередью сообщений этого потока".
Когда вы собираетесь закончить свою деятельность, например, в onDestroy()
Вам также нужно отменить обратный вызов для запускаемого объекта, для которого он был запущен:
mHandler.removeCallbacks(previouslyStartedRunnable);
Вы можете сделать это даже без проверки, запущен ли runnable, пока ваша активность была активной.
ОБНОВИТЬ:
Есть два дополнительных случая для рассмотрения:
1.) Вы реализовали свой обработчик таким образом, что создали новый класс для Runnable, например
private class HandleUpdateInd implements Runnable...
Обычно это необходимо делать, если вам нужно запустить отложенный запуск с текущим набором параметров (который может изменяться до запуска). Чтобы отменить его вам нужно использовать
mHandler.removeCallbacksAndMessages(HandleUpdateInd.class);
2.) Если вы используете встроенный вызов (JPM спасибо за комментарий)
handler = new Handler() { public void handleMessage(Message msg) { ... } };
Затем вам нужно определить значение "что" для этого сообщения. Позже, если вам нужно отменить его, вы можете использовать
handler.removeMessages(what);
выполнить эту задачу.
Вы имеете в виду, что у вас есть тема где-то в вашей деятельности? Остановить поток довольно просто, вам нужна ссылка на этот поток. лайк:
private Thread mMyThread;
mMyThread = new Thread .......
и когда вы хотите остановить его, просто проверьте, не является ли ссылка нулевой, и вызовите метод прерывания:
if (mMyThread != null) {
mMyThread.interrupt();
}
надеюсь это поможет
Мне нравится ответ Зелимира, просто еще немного информации по этому вопросу - Android не определяет ограничения на срок службы приложения, приложение создается при первом запуске и может оставаться активным между несколькими циклами Activity onCreate/onDestroy. Обработчики связаны с одним основным потоком / очередью событий приложения, поэтому действие не может "остановить" его (хотя вы, вероятно, могли бы сделать это через Handler.getLooper(). Quit(), но я не уверен, что оно выиграло " Это может вызвать проблемы. Также вы можете убить все приложение, как описано здесь).
Вероятно, концепция Android состоит в том, чтобы как можно больше использовать экземпляры приложений, поэтому ваша основная задача при разработке Activity - правильная очистка ресурсов Activity по вызову onDestroy. Статические переменные, потоки, AsyncTasks и сообщения / обратные вызовы в обработчиках - это то, о чем нужно беспокоиться.