2013-02-11 103 views
3

在Android中,當我在服務中創建runnable並運行它時,雖然我意識到它運行在它自己的線程中,但此線程是UI線程的一部分嗎?換句話說,如果runnable進行了一個漫長的過程,會不會影響UI?在UI線程中運行的服務中是否可運行

編輯:

​​
+0

取決於你如何運行它。 – njzk2 2013-02-11 08:51:30

+1

你的假設「......雖然我意識到它在自己的線程中運行......」是不正確的。一個'Runnable'可以在任何地方運行,這取決於你在哪裏運行它。例如,如果你只是在你的'Service'中創建一個'Handler',然後使用'Handler'發佈你的'Runnable',它就會在主線程(UI)上運行。 – 2013-02-11 09:30:01

+0

感謝您的編輯。使用此代碼,您的'Runnable'正在主(UI)線程上運行。如果此'Runnable'花費很長時間,則可能會導致使用ANR(應用程序不響應)錯誤強制關閉您的應用程序。 – 2013-02-11 09:31:26

回答

10

文檔:

一個服務運行在相同的工藝,它是 聲明並在該應用程序的主線程的應用程序,

不同的線程:

Thread t = new Thread(new MyRunnable()); 
t.start(); 

UI /服務主題:

Handler h = new Handler(); 
h.postRunnable(new MyRunnable()); 
+0

但是這是指一項服務。我的問題是關於從服務啓動一個可運行的。 – AndroidDev 2013-02-11 09:18:20

+2

@AndroidDev第一段代碼在一個單獨的線程上啓動一個'Runnable',**與UI線程**完全無關。第二段代碼在運行服務的**相同線程**上運行'Runnable',它**將影響UI線程**。 – 2013-02-11 09:22:22

+0

我使用Handler啓動它,所以根據您的說法,它必須在UI線程上運行。 – AndroidDev 2013-02-11 09:41:31

1

不,它不是UI thread一部分,我想通過Runnable你的意思是,你通過調用start()執行一個新的線程。

不論您是否在UI線程的serviceactivity是部分開始新的Thread(除非你調用像join()

編輯

既然你正在運行一個Runnable對象與Handler,所以它將取決於你在哪裏初始化你的handler。服務在main thread運行,因此在初始化服務或活動的處理程序將使代碼發佈到UI thread

注意,你需要根據你的線程單一Handler對象;所以每次例如避免創建一個新的。應該避免使用(new Handler()).postDelayed(runnable, 1000);,而使用handler.postDelayed(runnable, 1000);其中handler是在服務/活動類別中初始化的實例變量

+0

User117似乎是另有所指。你確定? – AndroidDev 2013-02-11 09:19:01

+0

你的問題需要更多的澄清,你的意思是'Runnable'。我明確提到它,如果你通過調用'start()'啓動一個新的'Thread',它將會和'UI Thread'不同' – iTech 2013-02-11 09:22:48

+0

請參閱我在原始文章中添加的代碼。沒有開始。 – AndroidDev 2013-02-11 09:31:49

0

默認情況下,服務在UI線程中運行。但它取決於服務類型和服務屬性以及發佈可運行的方式。我認爲你使用默認方案,你的runnable將在UI線程上執行並阻止它。

如果您顯示代碼如何發佈runnable並創建服務,我可以給你確切的答案。

您可以從可運行使用下面的代碼檢查螺紋類型:

if (Looper.getMainLooper().getThread() == Thread.currentThread()) { 
    // On UI thread. 
} else { 
    // Not on UI thread. 
} 

它仍然是不明確的。如果您在UI線程上執行「new Handler()」,則會在UI線程上執行runnable。如果在另一個線程上使用循環執行「new Handler()」,則會在該線程上執行runnable。我認爲99%的概率會在UI線程上執行你的runnable。你爲什麼不把我的代碼放在runnable中並檢查它的執行位置?

+0

我在此處看到相互衝突的回覆。有些人似乎說是,其他人說不。 – AndroidDev 2013-02-11 09:20:48

+0

@AndroidDev是的,因爲有不同的方法來「創建一個Runnable」。如果你用你用來「創建一個Runnable」的代碼更新你的帖子,那麼我們可以給你一個更好的答案。 – 2013-02-11 09:26:17

+0

已添加代碼。代碼在服務中執行。 – AndroidDev 2013-02-11 09:30:39

0

您提交到處理程序將可運行在UI線程上總是執行,因爲服務沒有在不同的進程或threda產卵,但你是興田UI線程的一部分

相關問題