有沒有什麼方法可以讓Android知道,如果運行我的代碼的線程是UI線程還是不是?在鞦韆有SwingUtilities.isEventDispatchThread()
告訴我,如果我在UI線程,或不。 Android SDK中是否有任何功能讓我知道這一點?如何知道這個線程是否是一個UI線程
21
A
回答
39
答案從這裏借:How to check if current thread is not main thread
Looper.myLooper() == Looper.getMainLooper()
任何Android應用只有一個UI線程,所以你可以在某處活動回調喜歡的onCreate()檢查和存儲其ID和稍後將該線程的ID與存儲的ID進行比較。
mMainThreadId = Thread.currentThread().getId();
無論如何,你可以省略檢查,如果你想使用
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();
相關問題
- 1. UI線程如何知道另一個線程上的數據?
- 2. Python線程 - 如何知道線程是否已在運行?
- 3. 這是否在UI線程上運行
- 4. 如何讓1個UI線程等待另一個UI線程
- 5. 如何知道是誰開始線程
- 6. Android:每個UI線程在一個Activity中是否有獨立的線程?
- 7. Python,是否適合一個線程產生另一個線程
- 8. 如何知道nuget工具是否是線程安全的(.NET)?
- 9. 如何知道誰是給定線程ID的父線程
- 10. 這個類是否線程安全?
- 11. 我如何知道在Windows CE下是否掛起一個線程?
- 12. 如何知道另一個線程是否正在訪問資源?
- 13. 如何知道一個線程是否在SWT環境中完成其任務?
- 14. 一個線程如何確定另一個線程是否已經崩潰?
- 15. Reskit - 回調在同一個線程而不是UI線程
- 16. 如何知道所有線程池的線程是否已完成其任務?
- 17. 是否有可能知道哪個線程先完成?
- 18. 對於一個多線程程序,如果一個線程死亡,你怎麼知道這個?
- 19. 在另一個線程中使用線程是否是一個好習慣?
- 20. 單線程進程是否只包含一個線程?
- 21. 如何知道用戶是否在線?
- 22. 關於UI線程的這個工作是如何進行的
- 23. AsynckTask.onPostExecute和FragmentActivity.onResumeFragments是否在同一個線程(ui線程)上運行?
- 24. 如何知道我是否在UI線程上執行某些操作?
- 25. 這是一個java代碼是否線程安全?
- 26. 如何知道是否有流水線輸入到perl程序
- 27. 如何知道線程執行是否終止?
- 28. 如何知道是否有活動的線程?
- 29. 如何知道線程是否還活着然後殺死它?
- 30. 如何知道線程是否在Perl中使用die
爲什麼你需要知道你的代碼在哪個線程上運行?如果它是用於UI線程的,則只需將其分派到那裏。 –
您通常只是知道何時在ui線程上執行某個方法。任何情況下,特別是你有什麼疑問? – njzk2
沒有特定的情況。只是確定我的多線程代碼的一種方法。 – user1730789