Używam AsyncTask
do operacji ładowania, które zaimplementowałem jako klasa wewnętrzna.
W onPreExecute()
pokazuję okno dialogowe ładowania, które następnie ukrywamonPostExecute()
. Ale w przypadku niektórych operacji ładowania wiem z góry, że kończą się one bardzo szybko, więc nie chcę wyświetlać okna dialogowego ładowania.
Chciałem to wskazać za pomocą parametru boolowskiego, do którego mogłem przejść, onPreExecute()
ale najwyraźniej z jakiegoś powoduonPreExecute()
nie przyjmuje żadnych parametrów.
Oczywistym obejściem byłoby prawdopodobnie utworzenie pola członkowskiego w moim AsyncTask lub w klasie zewnętrznej, które musiałbym ustawić przed każdą operacją ładowania, ale nie wydaje się to zbyt eleganckie. Czy jest lepszy sposób na zrobienie tego?
źródło
1) Dla mnie jest to najprostszy sposób przekazywania parametrów do zadania asynchronicznego w ten sposób
Zadeklaruj i użyj zadania asynchronicznego, tak jak tutaj
2) Przekazywanie metod do zadania asynchronicznego Aby uniknąć wielokrotnego kodowania infrastruktury Async-Task (wątek, messagenhandler, ...), możesz rozważyć przekazanie metod, które powinny być wykonane w zadaniu asynchronicznym jako parametr. Poniższy przykład przedstawia to podejście. Ponadto może zajść potrzeba podklasy zadania asynchronicznego, aby przekazać parametry inicjalizacji w konstruktorze.
źródło
dlaczego, jak i które parametry są przekazywane do Asynctask <>, zobacz szczegóły tutaj . Myślę, że to najlepsze wyjaśnienie.
Dokumentacja Google dotycząca Androida mówi, że:
Zadanie asynchroniczne jest definiowane przez 3 typy ogólne, zwane Params, Progress i Result oraz 4 kroki, nazywane onPreExecute, doInBackground, onProgressUpdate i onPostExecute.
Typy ogólne AsyncTask:
Trzy typy używane przez zadanie asynchroniczne są następujące:
Params, rodzaj parametrów wysyłanych do zadania po jego wykonaniu. Postęp, typ jednostek postępu opublikowanych podczas obliczeń w tle. Wynik, typ wyniku obliczeń w tle. Nie wszystkie typy są zawsze używane przez zadanie asynchroniczne. Aby oznaczyć typ jako nieużywany, po prostu użyj typu Void:
Możesz dalej polecić: http://developer.android.com/reference/android/os/AsyncTask.html
Lub możesz wyjaśnić, jaką rolę pełni AsyncTask, kierując blog Sankar-Ganesh
Cóż, struktura typowej klasy AsyncTask wygląda następująco:
Ta metoda jest wykonywana przed uruchomieniem nowego Thread. Nie ma wartości wejściowych / wyjściowych, więc po prostu zainicjuj zmienne lub cokolwiek myślisz, że musisz zrobić.
Najważniejsza metoda w klasie AsyncTask. Musisz umieścić tutaj wszystkie rzeczy, które chcesz zrobić w tle, w innym wątku niż główny. Tutaj mamy jako wartość wejściową tablicę obiektów typu „X” (czy widzisz w nagłówku? Mamy „… extends AsyncTask” To są TYPY parametrów wejściowych) i zwraca obiekt z typu „Z”.
protected void onProgressUpdate (Y y) {
} Ta metoda jest wywoływana za pomocą metody publicProgress (y) i jest zwykle używana, gdy chcesz pokazać postęp lub informacje na ekranie głównym, takie jak pasek postępu pokazujący postęp operacji, którą wykonujesz w tle.
protected void onPostExecute (Z z) {
} Ta metoda jest wywoływana po wykonaniu operacji w tle. Jako parametr wejściowy otrzymasz parametr wyjściowy metody doInBackground.
A co z typami X, Y i Z?
Jak można wywnioskować z powyższej struktury:
Jak nazywamy to zadanie z zewnątrz? Tylko z następującymi dwoma wierszami:
Gdzie x jest parametrem wejściowym typu X.
Po uruchomieniu zadania możemy dowiedzieć się o jego statusie „z zewnątrz”. Korzystanie z metody „getStatus ()”.
myTask.getStatus (); i możemy otrzymać następujący status:
RUNNING - wskazuje, że zadanie jest uruchomione.
PENDING - wskazuje, że zadanie nie zostało jeszcze wykonane.
FINISHED - wskazuje, że onPostExecute (Z) został zakończony.
Wskazówki dotyczące korzystania z AsyncTask
Nie wywołuj ręcznie metod onPreExecute, doInBackground i onPostExecute. Jest to wykonywane automatycznie przez system.
Nie można wywołać AsyncTask wewnątrz innego AsyncTask lub Thread. Wywołanie metody należy wykonać w wątku interfejsu użytkownika.
Metoda onPostExecute jest wykonywana w wątku UI (tutaj możesz wywołać inny AsyncTask!).
Parametrami wejściowymi zadania może być tablica Object, w ten sposób możesz umieścić dowolne obiekty i typy.
źródło
Możesz przekazać parametr w konstruktorze zadania lub podczas wywoływania execute:
Pierwszy parametr (Object) jest przekazywany w doInBackground. Trzeci parametr (MyTaskResult) jest zwracany przez funkcję doInBackground. Możesz je zmienić na żądane typy. Trzy kropki oznaczają, że zero lub więcej obiektów (lub ich tablica) może zostać przekazanych jako argumenty.
źródło