Как остановить обработчик?

У меня есть сомнения.. У меня есть активность в моем приложении. Хотя моя деятельность разрушила обработчик, все еще работающий. Работает ли он на другом процессе, отличном от процесса приложения? Может ли кто-нибудь объяснить, почему он так работает? Можно ли остановить обработчик при удалении активности?

Заранее спасибо.

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 и сообщения / обратные вызовы в обработчиках - это то, о чем нужно беспокоиться.

Другие вопросы по тегам