2013-05-12 76 views
1

Google的gtalksms for Android使用Service中的Handler。當它開始的處理器線程它存儲線程ID,然後在處理程序具有以下檢查:Android線程ID檢查

if (Thread.currentThread().getId() != mHandlerThreadId) { 
     throw new IllegalThreadStateException(); 
} 

我的問題是,爲什麼你會需要這種類型的檢查?是好的練習還是什麼?我對多線程很陌生。

編輯:

只是要清楚,這是HandlerThread:

HandlerThread handlerThread = new HandlerThread("My.Service"); 
    handlerThread.start(); 
    mHandlerThreadId = handlerThread.getId(); 
    ServiceHandler serviceHandler = new ServiceHandler(handlerThread.getLooper()); 
+2

這會檢查當前線程是一樣的UI線程。 – 2013-05-12 11:50:24

+0

我不這麼認爲,這是Handler線程的線程ID。 – shmish111 2013-05-12 12:50:14

+0

處理程序沒有自己的線程,它在UI線程上運行 – 2013-05-12 12:51:11

回答

2

你爲什麼會需要這種類型的檢查?

該聲明確保該方法正在HandlerThread上運行。通常,如果對象或進程需要單線程,這是檢查對象是否正確使用的一種方法。如果有人從多個線程調用它,則會出現異常。

一個常見的例子是幾乎總是意味着單線程的GUI--一些實現執行這些類型的檢查以確保您始終從UI線程更改UI組件。

在這個特定的情況下,我不知道該庫的細節,但我想它在多線程環境中的表現並不像預期的那樣,並且開發者介紹了該檢查以禁止這種用法。

注:techncially,這是不可能的兩個線程具有相同的ID,但不是不可能的,所以檢查也可能是:if (Thread.currentThread().equals(handlerThread));

+0

非常感謝,只是我正在尋找的答案類型。 – shmish111 2013-05-13 10:13:16