2012-01-11 9 views
14

Mam aplikację, która używa AsyncTasks do wywoływania serwera REST.Kiedy aplikacja przechodzi do tła podczas wykonywania zadania AsyncTask, co powinna zrobić?

Wyobraź sobie, że podczas okresu ładowania (to jest, AsyncTask przechodzi do serwera REST i pobiera dane do następnego ekranu), użytkownik naciska Home.

Co jest zalecane:

  • Anuluj bieżące AsyncTask (S) i ponownego uruchomienia po wznowieniu Aktywny

lub

  • kontynuować AsyncTasks ale unikając startActivity przez sprawdzenie, czy aplikacja jest w tle (aby uniknąć pierwszego planu nowej aktywności po wysłaniu aplikacji na tło). I onResume wysyłając do następnej aktywności

najgorszym przypadku scenariuszy, które powinny przewidujesz:

  1. Aplikacja przechodzi do tła i ginie z powodu braku pamięci
  2. asynctask nie ze względu na przekroczenie limitu czasu lub inny błąd REST

Po zarówno użytkownik wraca do aplikacji ...

+0

zależy od Twoich wymagań.
Jeśli chcesz zapytać, jak zrobić jeden z dwóch wymienionych przez ciebie sposobów, to jest to inny przypadek.
Powiedz, czy tego właśnie potrzebujesz. – akkilis

+0

Nie wiem, jak zaimplementować. Chcę wiedzieć, czy tak czy inaczej z tych dwóch jest bardziej zalecane i dlaczego. Jakie są problemy i zalety każdego z nich. – neteinstein

+0

Jak już powiedziałem, zależy to od Twoich wymagań. 1. Zapewnia, że ​​po wstrzymaniu działania nie podejmuje się żadnych działań i zapewnia, że ​​niektóre typowe wyjątki zgłoszone w takich przypadkach zostaną odrzucone. 2. Będzie wymagać nieco więcej obsługi w kodzie i utrzymania zmiennej stanu i jest bardziej wyrafinowany pod względem doświadczenia. Ale masz problemy ze zgłaszaniem wyjątków/lub niestałości w przypadku, gdy Android usunął twoją aktywność ze stosu działań. W takim przypadku wątek zostanie załadowany ponownie, mimo że został wykonany wcześniej, ponieważ wcześniejsza instancja została usunięta przez system Android. – akkilis

Odpowiedz

6

Dobrze ll polecam usługi, które powinny stosować AsyncTask zrobić swoją pracę. Usługa będzie izolować Twoją aktywność od zmiany orientacji lub wyjścia użytkownika. AsycnTask będzie izolować od zablokowanego wątku interfejsu użytkownika. Ale upewnij się, aby wyjść z usługi po zakończeniu REST API.

Zapewni to najlepsze z nich. Jeśli nie używasz DB jako lokalnej pamięci podręcznej, możesz spróbować. Więc nawet jeśli użytkownik odejdzie, usługa zapisze pobrane dane w bazie danych, a po powrocie użytkownika szybko wyświetli ekran.

EDYCJA: Wystarczy dodać IntentService są łatwe do wdrożenia.

Spróbuj Design Patterns for REST clients on Android by Google dla bardziej wyczerpujących wyjaśnień

0

pobieranie kontynuuje tak samo jak aplikacja Android Market, ale pokazuje powiadomienie z opcją anulowania. Możesz to zaimplementować, korzystając z usługi do pobrania.

+1

Nie pobieram "aplikacji" lub czegoś konkretnego, jak rynek. Naprawdę nie sądzę, że jest to rozwiązanie przyjazne dla użytkownika ... – neteinstein

+0

To tylko jeden z przykładów świetnej obsługi, która wykorzystuje Android Market do pobierania treści. Jeśli pobierasz mały zestaw danych, pierwsza alternatywa jest poprawna. Jeśli pobierasz dużą ilość danych, musisz imitować aplikację Android Market. –

3

Korzystanie z AsyncTasks może stać się naprawdę nieporządne podczas zmiany konfiguracji. Z osobistych doświadczeń polecam zamiast tego pójść trasą IntentService/ResultReceiver.

Zobacz ten post, aby uzyskać więcej informacji:

Restful API service

+0

Podczas obracania nie ma problemu, ponieważ mam rzeczywiście odniesienie do działania, gdy tylko zostanie utworzone nowe działanie, zastępuję je nowym. – neteinstein

+1

Bez względu na to, trasa IntentService nadal jest bardziej niezawodnym sposobem, aby przejść – SeanPONeil

1

myślę, co chcesz wiedzieć, w jaki sposób jest lepszy z punktu widzenia użytkownika. Z mojego doświadczenia wynika, że ​​użytkownik oczekuje, że aplikacja będzie kontynuowała pobieranie w tle, ponieważ jeśli wróci do domu, normalnie albo chce sprawdzić inne aplikacje, albo nacisnął je niezamierzone i chce wrócić do aplikacji, gdy tylko możliwy. Jeśli użytkownik chce anulować pobieranie, normalnie naciska przycisk Wstecz lub określony przycisk, aby anulować, który jest gdzieś na ekranie aplikacji.Ponieważ użytkownik chce nadal korzystać z aplikacji, wygodniejsze zachowanie aplikacji polega na kontynuowaniu pobierania danych i, mam nadzieję, już wyświetla pobrane dane użytkownikowi po jego powrocie do aplikacji.

Z technicznego punktu widzenia nie korzystałbym z usługi. Po prostu zostawiłbym AsyncTask pracujący. A w najgorszym przypadku, gdy aplikacja zostanie zabita między nimi, aplikacja automatycznie przejdzie do początkowej aktywności, gdy użytkownik wróci do aplikacji, ponieważ i tak aplikacja zostanie zrestartowana. W przypadku niepowodzenia asynctasku możesz sprawdzić, czy dane zostały pomyślnie pobrane, a jeśli nie, to zaczynasz. Możesz to łatwo zaimplementować, przechowując pobrane dane w zmiennej, której wartość początkowa wynosi zero. Jeśli zmienna jest nadal pusta po pobraniu, AsyncTask nie powiodło się i musisz przejść do działania początkowego. Myślę, że jest to dość solidna implementacja.

+0

Szukałem obu. Dzięki :-) – neteinstein

Powiązane problemy