2012-10-12 160 views
21

有沒有什麼方法可以讓Android知道,如果運行我的代碼的線程是UI線程還是不是?在鞦韆有SwingUtilities.isEventDispatchThread()告訴我,如果我在UI線程,或不。 Android SDK中是否有任何功能讓我知道這一點?如何知道這個線程是否是一個UI線程

+1

爲什麼你需要知道你的代碼在哪個線程上運行?如果它是用於UI線程的,則只需將其分派到那裏。 –

+0

您通常只是知道何時在ui線程上執行某個方法。任何情況下,特別是你有什麼疑問? – njzk2

+0

沒有特定的情況。只是確定我的多線程代碼的一種方法。 – user1730789

回答

39
  1. 答案從這裏借:How to check if current thread is not main thread

    Looper.myLooper() == Looper.getMainLooper()

  2. 任何Android應用只有一個UI線程,所以你可以在某處活動回調喜歡的onCreate()檢查和存儲其ID和稍後將該線程的ID與存儲的ID進行比較。

    mMainThreadId = Thread.currentThread().getId();

  3. 無論如何,你可以省略檢查,如果你想使用

    mActivity.runOnUiThread(new Runnable() { 
        @Override 
        public void run() { 
        ... 
        } 
    }); 
    

這是保證上運行做UI線程上的東西,有活動的任何引用當前線程,如果它是UI,或者在UI線程中排隊。

0

嗡嗡聲實際上由於Android架構,所有活動都在主線程中運行,即UI線程。所以當你編寫一個活動時,活動中的所有內容都在UI線程中。
這就是爲什麼在Honeycomb中,當您在主線程中進行網絡調用時添加了錯誤:它完全阻止了用戶界面。

所以默認情況下,你實際上總是在UI線程中工作。另一件事:除非你明確地要求它在另一個線程中,否則一個服務將與其應用程序的活動在同一線程上運行。

那麼,該怎麼辦?

  • 當您必須在您的活動中進行繁重的計算;一種解決方案是使用AsyncTask(一個旨在允許您輕鬆使用另一個線程的類)。 onExecute()中的代碼在另一個線程中運行(但要謹慎,在您的主線程中運行postExecute)。另一個是當AsyncTask沒有真正適應時手動啓動一個新的線程。
  • 如果您創建一個執行昂貴後臺任務的服務,請使用清單的android:process =「:my_process」屬性使其在另一個線程中運行。您需要創建一個AIDL來與這個分離的服務進行通信,但這不是一個複雜的任務。
  • 許多對象,例如MediaPlayer,都有其方法的異步變體。儘量始終使用它們。
-1

在你想檢查的地方放一個斷點,當它被打到時,檢查你是否可以和你的UI進行交互(例如,如果UI沒有被凍結)。如果你不能與UI進行交互,那麼你就在UI線程中,否則你就在後臺線程中。

8

是的,有一種方法。 檢查當前線程對象與主線程對象的線程對象。主要的looper總是在UI線程中。

boolean isOnUiThread = Thread.currentThread() == Looper.getMainLooper().getThread(); 
相關問題