2013-03-04 71 views

回答

3

A Service 總是 默認情況下**在UI線程上運行。 因此,爲了避免ANR的doHeavyThings()方法應該剛剛開始一個新的Thread這是所有繁重的工作。

如果您想了解結果,您必須自行實施。例如,您可以將Messanger傳遞給Service,該號碼將用於從Service傳回給呼叫者。

下面的文章介紹如何使用MessangerService提供雙向通信: http://developer.android.com/guide/components/bound-services.html

另一種方法是使用IntentService。你可以閱讀更多關於它在這裏: http://developer.android.com/reference/android/app/IntentService.html



** - 您可以使用android:process屬性,爲<service>聲明AndroidManifest.xml文件裏在一個單獨的進程中運行它。 (感謝級堆垛機)

+2

只是一個說明。服務也可以在屬於應用程序的進程的主(「UI」)線程上運行,但與活動的主UI線程運行的進程是分開的。當然,這要求IPC。 - 我對OP的理解是它是第三方服務。另外,我的理解是,這個問題只涉及援引這樣的第三方服務。 – 2013-03-04 09:35:11

+0

你是對的。感謝您指出了這一點。 – Paul 2013-03-04 09:36:29

3

它取決於服務是否異步(通過回調)或同步傳遞其結果。

如果它同步傳遞結果,則不能在UI線程上調用這些方法。儘管UI線程將簡單地等待結果,而Service和綁定線程執行實際工作,但由於UI線程等待控制流的緣故,UI仍將被阻塞。

所以使用AsyncTask,HandlerThread或Thread。

如果服務異步傳遞其結果,那麼很可能會從UI線程中調用方法。

相關問題