Zbudowałem aplikację, która używa IntentService do manipulowania bazą danych aplikacji i wywoływania usług internetowych.
Przykład:
Mam działanie, które jest listą przedmiotów. Ta lista jest wypełniana przez CursorAdapter. Każda pozycja ma pole wyboru, a lista jest uporządkowana według zaznaczonych (niezaznaczone elementy na górze i zaznaczone elementy na dole). Gdy pole wyboru elementu jest zaznaczone, wysyłam intencję do mojego IntentService, informując go, aby oznaczył zaznaczoną kolumnę w tabeli bazy danych dla tego elementu, a następnie wiadomość jest rozgłaszana, Aktywność widzi ją i ponownie wysyła zapytanie do Kursora.
Kiedy używam urządzenia mobilnego i zaczynam szybko sprawdzać pola wyboru, aplikacja zasadniczo się zawiesza. Interfejs użytkownika nie zawiesza się, ale IntentService w tle tak. Mogę to stwierdzić, ponieważ Kursor na ekranie nie jest odświeżany.
Rozumiem, że intencje przekazywane do IntentServices nie są przetwarzane asynchronicznie. Czy to jest poprawne? Zachowuje się prawie tak, jakbym musiał używać semaforów, ale nie mogę zrozumieć, dlaczego intencje są kolejkowane i przetwarzane indywidualnie.
Załóżmy, że zaznaczę 3 pola wyboru; więc w kolejce są 3 intencje. Po pierwszym wysyłam wiadomość, którą otrzymuje Aktywność, nakazując jej ponowne zapytanie o kursor. Czy potencjalny problem może wynikać z tego, że ponownie wysyłam zapytanie do kursora w tym samym czasie, w którym przetwarzam drugą intencję (aktualizowanie innego wiersza w tabeli)? Zapytania kursora mają miejsce w wątku interfejsu użytkownika.
^ Myślę, że to jest mój problem. Czego powinienem użyć, aby to zsynchronizować? Semafory? Czy ktoś może wskazać mi dokumentację/przykłady?
Innym potencjalnym problemem jest to, co jeśli moja aktywność zarządza kursorem na stole; również moja IntentService wysyła zapytanie do Cursor z tej samej tabeli. Mam przypadki, w których tak się dzieje, gdy moja IntentService przechodzi przez każdy wiersz w Cursor, aby znaleźć elementy do wysłania do usługi sieci Web. Chociaż nie sądziłem, że będzie to problem, dopóki kursory nie będą wysyłać zapytań w tym samym czasie?
Czy ktoś ma inne pomysły?