AsyncTaskLoader vs AsyncTask

129

Ponieważ Honeycombi v4 Compatibility Libraryjest to możliwe w użyciu AsyncTaskLoader. Z tego, co rozumiem, AsyncTaskLoadermogą przetrwać zmiany konfiguracji, takie jak przewracanie ekranu.

Czy zaleca się używanie AsyncTaskLoaderzamiast AsyncTask? Czy też pojawia LoaderManagersię na zdjęciu?

Ale nie znalazłem żadnego dobrego przykładu (ów), jak poprawnie używać AsyncTaskLoader. Dokumenty również nie zawierają przykładów. Czy ktoś może podać dobre przykłady.

OK
źródło

Odpowiedzi:

51

Możesz rzucić okiem na kod źródłowy biblioteki zgodności, aby uzyskać więcej informacji. Co to FragmentActivityjest:

  • prowadzi wykaz LoaderManager„s
  • upewnij się, że nie zostaną zniszczone po odwróceniu telefonu (lub innej zmianie konfiguracji), zapisując instancje za pomocą onRetainNonConfigurationInstance()
  • kopnij odpowiedniego ładowacza, gdy wywołasz initLoader()swoją aktywność

Musisz użyć narzędzia LoaderManagerdo komunikacji z programami ładującymi i zapewnić potrzebne wywołania zwrotne, aby utworzyć program ładujący (y) i wypełnić swoje widoki danymi, które zwracają.

Generalnie powinno być łatwiej niż AsyncTasksamemu sobie radzić. Jednak AsyncTaskLoadernie jest dobrze udokumentowany, więc powinieneś przestudiować przykład w dokumentacji i / lub modelować swój kod według CursorLoader.

Nikolay Elenkov
źródło
5
Rzucę okiem na to. Może jest za wcześnie, aby znaleźć dobre przykłady na ten temat AsyncTaskLoader, a kiedy więcej programistów zacznie go używać, pojawi się więcej przykładów.
OKA,
48

Porównując AsyncTaskLoader z AsyncTask , jak być może wiesz, kiedy obrócisz ekran urządzenia, może to zniszczyć i odtworzyć Twoją aktywność, aby było jasne, niech obraz obraca Twoje urządzenie podczas transakcji sieciowej:

AsyncTask zostanie ponownie wykonany jako wątek w tle, a poprzednie przetwarzanie wątku w tle było po prostu zbędne i zombie.

AsyncTaskLoader zostanie ponownie użyty w oparciu o identyfikator modułu ładującego zarejestrowany wcześniej w programie Loader Manager, dlatego należy unikać ponownego wykonywania transakcji sieciowej.

Podsumowując, AsyncTaskLoader zapobiega duplikowaniu wątków w tle i eliminuje powielanie działań zombie.

Hoang Duc Dong
źródło
11

AsyncTaskLoader wykonuje tę samą funkcję co AsyncTask , ale trochę lepiej. Łatwiej radzi sobie ze zmianami konfiguracji działań i zachowuje się w ramach cykli życia fragmentów i działań. Fajną rzeczą jest to, że AsyncTaskLoader może być używany w każdej sytuacji, w której AsyncTask jest używany. Za każdym razem, gdy dane muszą zostać załadowane do pamięci, aby działanie / fragment mogły zostać obsłużone, AsyncTaskLoader może lepiej wykonać zadanie.

Jest jednak kilka problemów z używaniem AsyncTasks:

  • Zmiany konfiguracji mogą zepsuć sytuację
  • Wstrzymanie działania nie wstrzymuje AsyncTask
  • Spora ilość kodu standardowego (co oznacza więcej możliwych błędów)

AsyncTaskLoader doc

Attif
źródło
8

Niektóre różnice inne niż opisane w innych odpowiedziach:

Podczas korzystania z AsyncTaskLoader przez AsyncTask :

  • AsyncTaskLoader umożliwia nam ładowanie starych danych z pamięci podręcznej do momentu zwrócenia nowych danych przezforceLoad()

  • Możemy ustawić opóźnienia na AsyncTaskLoader, dzięki setUpdateThrottle()czemu możemy zapobiec kolejnym aktualizacjom klienta (aktywność / fragment)

  • AsyncTaskLoader można udostępniać wielu fragmentom, jeśli mają one wspólną aktywność nadrzędną i jeśli zostały uruchomione zgetActivity().getSupportLoaderManager()

  • AsyncTaskLoader zostaje zniszczony, LoaderMangergdy jego połączone działanie nie jest już dostępne. podczas gdy musimy ręcznie zniszczyć AsyncTasks, jeśli jego aktywność wywołująca zniszczy. Oszczędza to nasz czas przed pisaniem wszystkich rzeczy rozliczeniowych. AsyncTaskLoader dobrze współpracuje z ich odpowiednimi cyklami życia.

Tak więc AsyncTaskLoader jest znacznie lepszy niż AsyncTask.

Palak Darji
źródło