2016-04-25 68 views
0

建立在我Androidapp我開始Runnable(稱爲remoteUDPRunnable),確立了一個新的Thread像這樣與其他設備的UDP Connection的Android停止了Runnable在新線程

new Thread(remoteUDPRunnable).start(); 

我一些情況,我想停止Thread(並取消UDP connection),但我不知道怎麼I'have

試圖保持Thread例如在variable並呼籲myThread.interrupt(),但它不工作。

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

所以我可以取消它這樣做:

我已經使用Handler這樣也試過

remoteUDPRunnableHandler.removeCallbacks(remoteUDPRunnable); 

這工作,但是當我打電話post(remoteUDPRunnable)方法,我收到了NetworkOnMainThreadException。我也嘗試將Runnable中的代碼放入AsyncTask之內,但它也不起作用。

任何想法?我對此很新,對此我有點困惑。 謝謝

+1

中斷只是在線程中設置一個標誌。你需要在你的Runnable中檢查該標誌(Thread.interrupted()),並確保你的線程到達並終止你自己。 –

+0

Re,「我試圖調用'myThread.interrupt()',但它不起作用。」:不工作怎麼辦?這聽起來像是一個很好的StackOverflow問題。你應該編寫一個小型的,自包含的示例程序,讓其他人可以運行,顯示t.interrupt()沒有做你期望的事情;然後你應該在這裏發佈,並問我們爲什麼它沒有做你期望的事情。 –

+0

P.S .:在這個問題中沒有理由使用「Runnable」這個詞。 'Runnable'只是意味着它有一個名爲'void run()'的方法。它沒有告訴我們有關你如何使用該對象的任何信息。 –

回答

2

如果你自己寫了remoteUDPRunnable這個類,你需要確保(以編程方式)線程結束。

電話thread.interrupt()只在該線程中設置標誌。但是,如果你從來沒有檢查過它,並且對它做了什麼,那完全沒用。

在您的runnable中,如果它返回true,則需要調用Thread.interrupted(),啓動關閉線程。請注意,調用Thread.interrupted()會重置正在執行的線程的中斷標誌。

另外,如果InterruptedException被拋出,中斷標誌也會被重置,因此您可能需要在可運行的對象中再次調用Thread.interrupt()