Възможно ли е IntentService да бъде убит преди дейността да го използва?

Имам приложение, което има IntentService за осигуряване на фонова обработка - по-специално то извлича данни от мрежата и ги съхранява в база данни на Sqlite. Моите дейности използват Context.startService(), за да поискат от услугата да актуализира данните и услугата изпраща локално излъчвано съобщение, когато актуализацията приключи.

IntentService използва пул от нишки, за да свърши работата - предимно в случай, че се отвори нова дейност, преди заявката да е завършена, така че нова заявка за различен ресурс няма да блокира изчакването предишната да завърши.

Всичко работи добре, но за да предотвратя множество едновременни заявки за един и същи ресурс, зададох флаг в дейността, след като тя изпрати заявка, която спира изпращането на нови заявки, докато не получи обратно съобщение ГОТОВО от услугата.

Сега, ако IntentService е бил убит по средата на операция, той никога няма да изпрати съобщението DONE и Activity никога няма да знае, че заявката е неизпълнена, и няма да поиска повторно ресурса. Възможно ли е това? И ако се случи, има ли начин Дейността да бъде информирана?


person Clyde    schedule 28.09.2012    source източник


Отговори (2)


Възможно ли е това?

Докато улавяте всички възможни необработени изключения, не. Компонентите не се "убиват" поотделно за, да речем, възстановяване на памет - това се прави на база процес по процес.

person CommonsWare    schedule 28.09.2012
comment
Благодаря! Не бях оценил, че само цели процеси ще бъдат прекратени. Разбира се, трябва да се уверя, че всички възможни изключения са уловени и вярвам, че го правя. Ако не съм, това е бъг и мой проблем. - person Clyde; 29.09.2012

Ако сте загрижени за това, изпратете флаг за излъчване в onDestroy на IntentService (или просто задайте точка на прекъсване, за да можете да видите дали е засегнат). IntentService е предназначена като опростена услуга, която се справя със собствения си жизнен цикъл, така че ако предавате работа от услугата към пул от нишки, възможно е IntentService да вярва, че е приключила работата си - можете да уловите това в onDestroy.

Очевидно не мога да кажа дали това се случва, без да погледна кода, но този механизъм ще ви позволи да проверите дали е така.

person Paul D'Ambra    schedule 28.09.2012