在Android中,當我在服務中創建runnable並運行它時,雖然我意識到它運行在它自己的線程中,但此線程是UI線程的一部分嗎?換句話說,如果runnable進行了一個漫長的過程,會不會影響UI?在UI線程中運行的服務中是否可運行
編輯:
在Android中,當我在服務中創建runnable並運行它時,雖然我意識到它運行在它自己的線程中,但此線程是UI線程的一部分嗎?換句話說,如果runnable進行了一個漫長的過程,會不會影響UI?在UI線程中運行的服務中是否可運行
編輯:
文檔:
一個服務運行在相同的工藝,它是 聲明並在該應用程序的主線程的應用程序,
不同的線程:
Thread t = new Thread(new MyRunnable());
t.start();
UI /服務主題:
Handler h = new Handler();
h.postRunnable(new MyRunnable());
但是這是指一項服務。我的問題是關於從服務啓動一個可運行的。 – AndroidDev 2013-02-11 09:18:20
@AndroidDev第一段代碼在一個單獨的線程上啓動一個'Runnable',**與UI線程**完全無關。第二段代碼在運行服務的**相同線程**上運行'Runnable',它**將影響UI線程**。 – 2013-02-11 09:22:22
我使用Handler啓動它,所以根據您的說法,它必須在UI線程上運行。 – AndroidDev 2013-02-11 09:41:31
不,它不是UI thread
一部分,我想通過Runnable
你的意思是,你通過調用start()
執行一個新的線程。
不論您是否在UI線程的service
或activity
將不是部分開始新的Thread
(除非你調用像join()
)
編輯
既然你正在運行一個Runnable
對象與Handler
,所以它將取決於你在哪裏初始化你的handler
。服務在main thread
運行,因此在初始化服務或活動的處理程序將使代碼發佈到UI thread
注意,你需要根據你的線程單一Handler
對象;所以每次例如避免創建一個新的。應該避免使用(new Handler()).postDelayed(runnable, 1000);
,而使用handler.postDelayed(runnable, 1000);
其中handler
是在服務/活動類別中初始化的實例變量
User117似乎是另有所指。你確定? – AndroidDev 2013-02-11 09:19:01
你的問題需要更多的澄清,你的意思是'Runnable'。我明確提到它,如果你通過調用'start()'啓動一個新的'Thread',它將會和'UI Thread'不同' – iTech 2013-02-11 09:22:48
請參閱我在原始文章中添加的代碼。沒有開始。 – AndroidDev 2013-02-11 09:31:49
默認情況下,服務在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中並檢查它的執行位置?
我在此處看到相互衝突的回覆。有些人似乎說是,其他人說不。 – AndroidDev 2013-02-11 09:20:48
@AndroidDev是的,因爲有不同的方法來「創建一個Runnable」。如果你用你用來「創建一個Runnable」的代碼更新你的帖子,那麼我們可以給你一個更好的答案。 – 2013-02-11 09:26:17
已添加代碼。代碼在服務中執行。 – AndroidDev 2013-02-11 09:30:39
您提交到處理程序將可運行在UI線程上總是執行,因爲服務沒有在不同的進程或threda產卵,但你是興田UI線程的一部分
取決於你如何運行它。 – njzk2 2013-02-11 08:51:30
你的假設「......雖然我意識到它在自己的線程中運行......」是不正確的。一個'Runnable'可以在任何地方運行,這取決於你在哪裏運行它。例如,如果你只是在你的'Service'中創建一個'Handler',然後使用'Handler'發佈你的'Runnable',它就會在主線程(UI)上運行。 – 2013-02-11 09:30:01
感謝您的編輯。使用此代碼,您的'Runnable'正在主(UI)線程上運行。如果此'Runnable'花費很長時間,則可能會導致使用ANR(應用程序不響應)錯誤強制關閉您的應用程序。 – 2013-02-11 09:31:26