2013-12-15 43 views
1

我正在研究一個包含在其他應用程序中的jar文件,它必須非常健壯。Android是否安全地假設「主/ UI線程」ID始終爲1?

在罐子裏,我有一個對象,說SomeView,它需要一個Android上下文,試圖創建一個Handler對象,並會觸及視圖,所以它需要從主線程初始化。我怎樣才能保證100%,他們不會初始化我的SomeView在錯誤的線程?

如:

public class SomeView { 
    Handler mHandler; 
    public SomeView(Context context) { 
     mHandler = new Handler(); 
    } 
} 

即會在構造函數中工作if (Thread.currentThread().getId() != 1) failSafely();

+1

看起來像http://stackoverflow.com/questions/2848575/how-to-detect-ui-thread-on-android的副本 – MTilsted

+0

@MTilsted感謝您的發現。我也想知道,在我的特殊情況下,如果我只想檢查線程ID,而不是對象,它會更好。 –

回答

2

我怎樣才能保證100%,他們不會初始化我的SomeView在錯誤的線程?

包裝你的代碼在Runnable,並使用runOnUiThread()(上Activity)或post()(上SomeView),以確保其在主應用程序線程上運行。

即如果(Thread.currentThread()。getId()!= 1)failSafely();在構造函數中工作?

我當然不會指望這一點。

使用Looper.getMainLooper().getThread()獲取代表主應用程序線程的Thread對象。但是,我只是將線程敏感塊包裝在Runnables中,並讓這些塊在主應用程序線程上運行。

+0

至於你的第一個建議:SomeView的構造函數是SomeView(上下文上下文),它允許一個全局的應用上下文,它沒有任何'runOnUiThread()'的概念(只有'Activity') 。如果我使用'post()',我假設我必須使用'Handler'對象?如果開發人員在錯誤的線程中意外地從我的SomeView的構造函數中實例化了mHandler,它將會崩潰:「無法在未調用Looper.prepare()的線程中創建處理程序」 –

+1

@DavidT .:「它允許全局應用程序上下文「 - 不要使用'Application'上下文創建'View'的實例。 「如果我使用post(),我假設我必須使用Handler對象?」 - 'post()'也是'View'的一種方法。 – CommonsWare

+0

至於你的第二個建議,我可以假設100%的時間,即使在數百萬的普通Android股票設備上運行,即''Thread.currentThread()。getId()!= Looper.getMainLooper()。getThread()。 getId()'是否正確? –