2015-08-05 2 views
0

В первый раз я вызываю HandlerThread.start() для обработки фоновой службы. после того, как все закончилось, я хочу закончить эту тему, вызвав HandlerThread.quit().Got IllegalThreadStateException при вызове HandlerThread.start() второй раз после HandlerThread.quit()

Затем во второй раз я запускаю этот обработчик и проверял HandlerThread.isAlive(), isAlive() возвращает false, но когда я снова вызываю HandlerThread с помощью HandlerThread.start().

Но я получил IllegalThreadStateException, почему?

Как я могу остановить HandlerThread, прежде чем я снова вызову handlerThread.start() безопасно?

ответ

0

Как уже говорилось, вы никогда не может вызвать меню Пуск/Выполнить/выполнить метод на объекте потока более чем один раз, как вы получите IllegalThreadStateException.

Вы можете, однако, использовать что-то вроде ExecutorService, что позволит вам использовать один и тот же номер Runnable несколько раз.

Кроме того, если вы используете ThreadPoolExecutor, который является потомком ExecutorService, позаботится об управлении памятью и потоками.

+0

спасибо, я уже знаю это, прочитав код comce google, потому что после этого thread.start() поток был отмечен и не может быть запущен снова. – Lee

+0

Я также не понимаю, почему вы хотите остановить поток, поскольку петлитель HandlerThread будет продолжать обрабатывать сообщения, пока не будет сказано остановить. Если это не ваше намерение, в этом случае я должен спросить, почему вы пытаетесь остановить, а затем перезапустить петлитель? – Catch44

+0

Если вы хотите остановить только петлитель (часть, где сообщения фактически обрабатываются) потока, то вы должны позвонить mCurrentLocationPresenter.getLooper(). Stop(); И перезапустить петлитель mCurrentLocationPresenter.getLooper(). Loop(); Из того, что я понимаю, вам не нужно перезапускать поток, вам нужно перезапустить петлитель в потоке. – Catch44

0

Вы не можете вызвать asyntask.execute() на одном и том же объекте более одного.

Всегда вызывать MyasynTask asyntask = new MyasynTask();

asyntask.execute(); 

более enter link description here

+0

Впервые я нашел это явление. Но я думал, что это создаст новый объект каждый раз, когда я нажму эту кнопку. Будет ли это слишком много памяти? – Lee