2016-04-25 1 views
0

В моей Androidapp я начать Runnable (так называемый remoteUDPRunnable), который устанавливает UDP Connection с другим устройством в новом Thread, как это:Android Stop Runnable создан в новой Тема

new Thread(remoteUDPRunnable).start(); 

I в некоторых случаях, я хочу прекрати Thread (и отменить UDP connection), но я не знаю, как

I'have пытался сохранить экземпляр Thread в variable и вызвать myThread.interrupt(), но он не работает.

Я также попытался с помощью Handler так:

final Handler remoteUDPRunnableHandler = new Handler(); 
remoteUDPRunnableHandler.post(remoteUDPRunnable); 

Так что я могу отменить это сделать:

remoteUDPRunnableHandler.removeCallbacks(remoteUDPRunnable); 

Это работает, но когда я вызываю метод post(remoteUDPRunnable) я получаю NetworkOnMainThreadException. Я также попытался поместить код внутри Runnable внутри AsyncTask, но он тоже не работает.

Любые идеи? Я новичок в этом, и я немного смущен. Thanks

+1

прерывание просто устанавливает флаг в потоке. Вы должны проверить этот флаг (Thread.interrupted()) в своем Runnable и убедиться, что ваш поток приходит и заканчивается. –

+0

Re: «Я попытался [...] вызвать' myThread.interrupt() ', но это не сработает.": Не работает как? Похоже, это создаст хороший вопрос StackOverflow. Вы должны составить небольшую самодостаточную примерную программу, которую могут запускать другие люди, которая показывает 't.interrupt()' не выполнение того, что вы ожидаете от нее; и тогда вы должны опубликовать его здесь, и спросите нас, почему он не делает то, что вы ожидаете от него. –

+0

P.S .: В этом вопросе нет оснований использовать слово «Runnable». «Runnable» просто означает, что это объект, который имеет метод с именем «void run()». Это ничего не говорит нам о том, как вы используете этот объект. –

ответ

2

Если вы написали класс remoteUDPRunnable самостоятельно, вам необходимо убедиться (программно), что нить подходит к концу.

Звонок thread.interrupt() устанавливает только флаг в этом потоке. Но если вы никогда не проверяете это и ничего не делаете с ним, это совершенно бесполезно.

В вашей runnable вам нужно позвонить Thread.interrupted(), если он вернёт true, инициирует выключение потока. Будьте осторожны, вызов Thread.interrupted() сбрасывает флаг прерывания исполняемого потока.

Кроме того, если выбрано InterruptedException, флаг прерывания также сброшен, поэтому вам может потребоваться снова позвонить Thread.interrupt() в ваш runnable.

Смежные вопросы