0

我讀過開發者瞭解應用小工具引導,我已經瞭解,以避免ANR錯誤,你應該開始你的AppWidgetProvider 的onUpdate方法中的服務更新部件......我有個問題關於這樣的服務:當我們開發可以從一個活動開始的標準服務時,我們應該在onStartCommand中避免過長的計算,因爲onStartCommand方法在主UI線程中運行..所以,我們應該避免長時間計算還內服務的onStartCommand開始由的AppWidgetProvider或在這種情況下,我們不會冒險阻擋UI?如果我們必須避免在這種情況下onStartCommand也長計算,我們可以開始一個工作線程的服務中,或使用一個Intent服務?在這種情況下,我們可以更新與我們想還是我們的風險,從UI線程以外更新UI線程的任何AppWidgetManagerupdateAppWidget方法的窗口小部件?我是否需要從主/ UI線程調用AppWidgetManager的updateAppWidget方法?

我希望這些問題是很清楚..

回答

1

可以啓動從一個的onUpdate意圖服務,然後更新使用AppWidgetManager照常服務的小部件。這並不意味着你要在UI線程之外更新UI。即使當你從onUpdate更新一個小部件時,你正在使用RemoteViews和AppWidgetManager,你並沒有直接更新UI。 AppWidgetManager實際上調用了一個更新小部件的內部Android服務,所以你不必擔心它。

我認爲,小部件的UI線程是在發射器,但我不知道。無論如何,widget的代碼不會在該線程上運行,這就是爲什麼我們有RemoteViews。

+0

感謝您的答案..順便說一句,如果我不使用意向服務,但一個服務,然後我卡在* onStartCommand *幾秒鐘,我在這種情況下還會冒ANR錯誤嗎? * onStartCommand *的文檔建議您爲長期活動產生另一個線程,這不是他們在[Wictionary示例]中所做的(http://code.google.com/p/wiktionary-android/source/browse/trunk /Wiktionary/src/com/example/android/wiktionary/WordWidget.java)。 –

+0

任何有關在被調用的服務的* onStartCommand *方法中執行長時間等待所導致的可能的ANR的想法? –

+1

就像文檔所說,服務代碼在UI線程中運行。您應該使用IntentService,並使用'onHandleIntent(Intent)'工作或使用常規服務並啓動您自己的線程。 – Ran

相關問題