2012-10-17 52 views
1

如果我有一個Android服務,其在onStartCommand,有以下幾點:如果服務停止,後臺線程會發生什麼情況?

MyWidgetUpdater updater = new MyWidgetUpdater(); 
updater.updateWidgets(...); 

updater在後臺線程中檢索數據,然後更新前臺線程上的微件(一個或多個)。如果服務在後臺處理完成之前停止(例如stopSelf())會發生什麼情況?這是否會導致窗口小部件有時不完成更新(因爲線程大概會被殺死)?如果是這樣,是否有一種設計模式可以知道您的所有小部件何時完成更新以及其安全停止服務?

回答

3

如果在後臺處理完成之前停止服務(例如stopSelf()),會發生什麼情況?

假設這是一個你自己分叉的線程,Android會忘記該線程,它將繼續運行,泄露,直到Android終止你的進程。

如果是這樣,是否有設計模式知道您的所有小部件何時完成更新以及其安全停止服務?

在工作完成之前不要致電stopSelf()。我不知道你在哪裏打電話stopSelf(),但在你引用的模式中,通常在該線程結束時完成。

這就是爲什麼IntentService是受歡迎的原因之一:它處理所有的線程和stopSelf()東西給你。

+0

感謝CommonsWare。要添加更多細節,使用「AsyncTask」啓動後臺線程。如果停止服務(啓動「AsyncTask」),「onPostExecute()」會成功執行嗎? –

+1

是的。但是正如CommonsWare所指出的那樣,最好是在onPostExecute()的末尾使用IntentService或stopSelf()。 – pcans

+0

@ChrisKnight:「如果服務(啓動AsyncTask)停止,onPostExecute()會成功執行嗎?」 - 也許。您的流程可以隨時終止,並且當您的服務被銷燬時*更有可能被終止。因此,我同意pcans:要麼使用'IntentService',要麼直到'onPostExecute()'結束時才調用'stopSelf()'。 – CommonsWare

相關問題