2012-01-18 58 views
9

我總是創建兩個處理程序:一個在主線程上,另一個在單線程上。這是一個完美的方式來停止處理?

這是一個在Activity生命週期中啓動和停止它們的最佳方法嗎?

HandlerThread safeThread = null; 
Handler safeHandler = null; 
Handler handler = null; 


@Override 
    public void onStart() { 

if (safeThread == null) { 
      safeThread = new HandlerThread("safeThread"); 
      safeThread.start(); 
      safeHandler = new Handler(safeThread.getLooper()); 
     } else if (safeThread.getState() == Thread.State.NEW) { 
      safeThread.start(); 
      safeHandler = new Handler(safeThread.getLooper()); 
     } else if (safeThread.getState() == Thread.State.WAITING) { 
      safeHandler = new Handler(safeThread.getLooper()); 
     } else if (safeThread.getState() == Thread.State.TERMINATED) { 
      safeThread = null; 
      safeThread = new HandlerThread("safeThread"); 
      safeThread.start(); 
      safeHandler = new Handler(safeThread.getLooper()); 
     } 
} 




protected void onStop() { 
     Log.d("x", "onStop is executed"); 
     safeHandler = null; 
     safeThread.quit(); 
     safeThread.interrupt(); 
     safeThread = null; 
     super.onStop(); 
    } 
+0

safeThread.interrupt();是最好的方式來停止線程 – Sameer 2012-01-18 09:22:48

+0

是的,我知道但我想這是安全的,當我中斷後,並null。 – rex 2012-01-18 09:37:04

+1

我已經給出了答案..一件事我建議你,因爲你是新的在stackoverflow.IF你想欣賞某人的幫助,然後給他一票,如果你認爲答案是最好的然後將其標記爲答案.. :)歡迎和歡呼 – Sameer 2012-01-18 09:42:27

回答

0

您可以使用它作爲一種安全的方式來終止線程:

if (safeThread!= null) { 
    Thread moribund = safeThread; 
    safeThread = null; 
    moribund.interrupt(); 
} 
+1

欲瞭解更多詳情,請參閱此http://stackoverflow.com/questions/680180/where-to-stop-destroy-threads-in-android-service-class – Sameer 2012-01-18 09:43:08

+0

你能解釋更多的細節??什麼原因? – rex 2012-01-18 10:12:28

+0

對於原因請參閱我的以上評論中的問題 – Sameer 2012-01-18 10:13:27

15

我知道這是一個有點老問題,但我通過它尋找相同的答案,並進一步研究我不絆倒」相信當前的答案適用於HandlerThread(儘管對於普通線程絕對正確)

HandlerThread具有內置的quit()quitSafely(0123)方法來停止線程。 https://developer.android.com/reference/android/os/HandlerThread.html#quit()

只有在隊列中的消息停止或不處理之前,兩者之間的區別纔是。

safeThread.quit(); 
+0

要增加清晰度:quit()在API 5中可用 – Vyrx 2015-07-30 13:43:24

+2

api 18之前要做什麼? – JohnyTex 2016-02-16 11:14:04

+0

請問quit()或者quitSafely()是停止線程還是隻有線程必須處理消息的Looper?它不會解釋它是否結束線程[這裏](https://developer.android.com/reference/android/os/HandlerThread.html#quit())。 – Thracian 2017-10-17 15:01:36

8

如果啓動線程像這樣:

這樣回答,它是那樣簡單

HandlerThread thread = new HandlerThread("MyHandlerThread"); 
thread.start(); 

停止最安全的方式將是:

thread.quitSafely(); 

quitSafely確保在線程之前處理所有掛起的消息停止。

注:我原來的答覆包含的Thread.join到額外的電話,但我發現加入後quitSafely使用時調用不可靠的釋放。

+0

我也想知道我是否需要在quitSafely後加入。你能澄清「不能可靠地釋放」嗎?謝謝! – Kaifei 2016-02-02 22:53:39

+0

@Kaifei我記得我正在觀察,聯合調用只是阻止線程。那是在八月份,所以不是100%肯定的。 – SharkAlley 2016-02-03 00:34:56

相關問題