2012-10-17 6 views
1

나는 onStartCommand에서 다음을 가지고, 안드로이드 서비스가있는 경우 :서비스가 중지되면 백그라운드 스레드는 어떻게됩니까?

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

updater는 백그라운드 스레드에서 데이터를 검색 한 다음 전경 스레드에서 위젯 (들)를 업데이트합니다. 백그라운드 처리가 완료되기 전에 서비스가 중지되면 (예 : stopSelf()) 어떻게됩니까? 이로 인해 위젯이 때때로 업데이트를 완료하지 못하게됩니까 (스레드가 아마도 죽을 것이므로)? 그렇다면 모든 위젯이 업데이트를 완료하고 서비스를 중지 할 때를 알 수있는 디자인 패턴이 있습니까?

답변

3

백그라운드 처리가 완료되기 전에 서비스가 중지되면 (예 : stopSelf()) 어떻게됩니까?

이것이 사용자가 직접 처리 한 스레드라고 가정하면 Android는 해당 스레드를 알지 못합니다. Android는 프로세스가 종료 될 때까지 유출 된 상태로 계속 실행됩니다.

그렇다면 모든 위젯이 업데이트를 완료하고 서비스를 중지해도 안전하다는 것을 알 수있는 디자인 패턴이 있습니까?

작업이 완료 될 때까지 stopSelf()으로 전화하지 마십시오. 나는 당신이 어디에 stopSelf()를 부르고 있는지 모른다. 그러나 당신이 인용하고있는 패턴에서, 그것은 일반적으로 그 스레드의 끝에 이루어질 것이다.

이것은 IntentService이 인기있는 이유 중 하나입니다. 모든 스레드와 stopSelf() 자료를 처리합니다.

+0

감사합니다. CommonsWare. 더 자세한 정보를 추가하기 위해서 백그라운드 스레드는''AsyncTask''를 사용하여 시작됩니다. ''AsyncTask''를 시작한 서비스가 중지되면''onPostExecute()''가 성공적으로 실행됩니까? –

+1

예. 하지만 CommonsWare에서 지적한 것처럼 IntentService를 사용하거나 onPostExecute() 끝 부분에서 stopSelf()를 사용하는 것이 좋습니다. – pcans

+0

@ChrisKnight : "서비스 (AsyncTask를 시작한)가 중지되면 onPostExecute()가 성공적으로 실행됩니까?" -- 아마도. 귀하의 프로세스는 언제든지 해지 될 수 있으며 귀하의 서비스가 파괴 될 때 해지 될 가능성이 더 큽니다. 그러므로 나는 pcans에 동의한다 :'IntentService'를 사용하거나'onPostExecute()'의 끝까지'stopSelf()'를 호출하지 마라. – CommonsWare

관련 문제