Відповіді:
Документація Google для Android говорить:
Асинхронна задача визначається трьома загальними типами, що називаються Парамами, Прогресом та Результатом, та 4 кроками, які називаються onPreExecute, doInBackground, onProgressUpdate та onPostExecute.
Загальні типи AsyncTask:
Три типи, що використовуються асинхронною задачею, є наступними:
Params, the type of the parameters sent to the task upon execution.
Progress, the type of the progress units published during the background computation.
Result, the type of the result of the background computation.
Не всі типи завжди використовуються асинхронним завданням. Щоб позначити тип як невикористаний, просто використовуйте тип Void:
private class MyTask extends AsyncTask<Void, Void, Void> { ... }
Ви також можете посилатися на сторінку: http://developer.android.com/reference/android/os/AsyncTask.html
Або ви можете зрозуміти, у чому роль AsyncTask, переглянувши блог Санкара-Ганеша
private class MyTask extends AsyncTask<X, Y, Z>
protected void onPreExecute(){
}
Цей метод виконується перед запуском нової теми. Значення вводу / виводу немає, тому просто ініціалізуйте змінні або все, що ви думаєте, що вам потрібно зробити.
protected Z doInBackground(X...x){
}
Найважливіший метод у класі AsyncTask. Ви повинні розмістити тут усі речі, які ви хочете зробити на задньому плані, в іншій нитці від основної. Тут ми маємо як вхідне значення масив об’єктів типу "X" (Ви бачите в заголовку? У нас є "... extens AsyncTask" (це типи вхідних параметрів)) і повертає об'єкт від типу "Z".
protected void onProgressUpdate(Y y){
}
Цей метод називається за допомогою методу публікуватиProgress (y), і він зазвичай використовується, коли ви хочете показати будь-який прогрес або інформацію на головному екрані, як-от панель прогресу, що показує хід операції, яку ви виконуєте у фоновому режимі.
protected void onPostExecute(Z z){
}
Цей метод викликається після операції на задньому плані. Як вхідний параметр ви отримаєте вихідний параметр методу doInBackground.
Що з типами X, Y і Z?
Як можна зробити з наведеної структури:
X – The type of the input variables value you want to set to the background process. This can be an array of objects.
Y – The type of the objects you are going to enter in the onProgressUpdate method.
Z – The type of the result from the operations you have done in the background process.
Як ми називаємо це завдання поза класом? Просто з наступними двома рядками:
MyTask myTask = new MyTask();
myTask.execute(x);
Де x - вхідний параметр типу X.
Після того, як ми виконаємо наше завдання, ми зможемо дізнатись його стан із зовнішнього боку. Використовуючи метод «getStatus ()».
myTask.getStatus();
і ми можемо отримати такий статус:
РУНІНГ - вказує на те, що завдання виконується.
ОЧАКУВАННЯ - означає, що завдання ще не виконано.
ЗАВЕРШЕНО - Вказує на те, що onPostExecute (Z) закінчено.
Підказки щодо використання AsyncTask
Не викликайте методи onPreExecute, doInBackground та onPostExecute вручну. Це автоматично робиться системою.
Ви не можете викликати AsyncTask всередині іншого AsyncTask або Thread. Виклик виконавця методу повинен здійснюватися в потоці інтерфейсу користувача.
Метод onPostExecute виконується в потоці користувальницького інтерфейсу (тут ви можете викликати інший AsyncTask!).
Вхідними параметрами завдання може бути масив Object, таким чином ви можете розміщувати будь-які об'єкти та типи, які ви хочете.
WeakAsyncTask
а
AsyncTask
Фонова завдання , яка виконується в фоновому потоці. Він бере вхід , виконує прогрес і дає вихід .
тобто
AsyncTask<Input,Progress,Output>
.
На мій погляд, основне джерело плутанини виникає, коли ми намагаємось запам'ятати параметри в AsyncTask
.
Ключ: Не запам'ятовувати .
Якщо ви можете уявити, що вам справді потрібно зробити, то написання AsyncTask
правильного підпису буде шматочком пирога.
Просто з’ясуйте, які ваші вкладення , прогрес і результат , і вам буде добре.
doInBackgound()
метод є найважливішим методом у AsyncTask
тому, що
AsyncTask
параметрами.Тож давайте побачимо стосунки
doInBackground()
іonPostExecute()
,onProgressUpdate()
також є спорідненими
Покажіть мені код
Так як я напишу код для DownloadTask?
DownloadTask extends AsyncTask<String,Integer,String>{
@Override
public void onPreExecute()
{}
@Override
public String doInbackGround(String... params)
{
// Download code
int downloadPerc = // calculate that
publish(downloadPerc);
return "Download Success";
}
@Override
public void onPostExecute(String result)
{
super.onPostExecute(result);
}
@Override
public void onProgressUpdate(Integer... params)
{
// show in spinner, access UI elements
}
}
Як ви будете виконувати це завдання
new DownLoadTask().execute("Paradise.mp3");
// show in spinner, access UI elements
був просто руками вниз найпростішим поясненням onProgressUpdate(...)
:)
Перейдіть за наступними посиланнями:
Ви не можете передавати більше трьох аргументів, якщо ви хочете передати лише 1 аргумент, тоді використовуйте недійсні для двох інших аргументів.
1. private class DownloadFilesTask extends AsyncTask<URL, Integer, Long>
2. protected class InitTask extends AsyncTask<Context, Integer, Integer>
Асинхронна задача визначається обчисленням, яке працює на фоновому потоці і результат якого публікується на потоці інтерфейсу користувача. Асинхронна задача визначається трьома загальними типами, що називаються Парамами, Прогресом та Результатом, та 4 кроками, що називаються onPreExecute, doInBackground, onProgressUpdate та onPostExecute.
KPBird
Якщо коротко, в AsyncTask є 3 параметри
параметри для використання вводу в DoInBackground (Параметри рядка ...)
параметри для показу стану використання прогресу в OnProgressUpdate (String ... status)
параметри для використання результату в OnPostExcute (String ... результат)
Примітка: - [Тип параметрів може змінюватися залежно від вашої потреби]