Использование AsyncTask
Вы можете использовать AsyncTask
. У этого есть 3 шага к этому.
1. onPreExecute()
- что вы хотите сделать перед запуском doInBackground()
. Это происходит в основном потоке пользовательского интерфейса .
2. doInBackground()
- AsyncTask будет выполнять операции в фоновом потоке (фоновый поток создается Android, поэтому вам не нужно об этом беспокоиться) .
3. onPostExecute()
- здесь вы можете получить любые данные из метода doInBackground. Метод postExecute выполняется снова в основном потоке пользовательского интерфейса .
Таким образом, вы можете выполнять любые операции ввода-вывода в doInBackground()
и возвращать значение, полученное с сервера или любого другого источника данных.
Как объявить
Чтобы использовать AsyncTask
, вам необходимо расширить Android AsyncTask
.
Итак, ваше собственное объявление AsyncTask будет выглядеть так:
private class MyAsyncTask extends AsyncTask<Void, Void, Void> { ... }
Какие 3 общих аргумента вы спрашиваете?
1. Params - тип параметров, отправляемых заданию при выполнении.
2. Progress - тип единиц прогресса, опубликованных во время фонового вычисления. (Почти всегда будет Void
, если вы не заботитесь о фактическом ходе операции. Обратите внимание, что это Void
с заглавной буквой, а не void
в качестве типа возврата).
3. Result - тип результата вычисления фона.
Полный пример
private class LongOperation extends AsyncTask<String, Void, String> {
@Override
protected String doInBackground(String... params) {
for (int i = 0; i < 5; i++) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
Thread.interrupted();
}
}
return "Executed";
}
@Override
protected void onPostExecute(String result) {
TextView txt = findViewById(R.id.output);
txt.setText(result);
}
}
В этом примере я создаю поддельную длинную операцию, которую вы не можете запустить в основном потоке пользовательского интерфейса (поскольку это блокирующая операция).
Когда операция завершается, она возвращает String
, и то же самое String
получено в методе onPostExecute()
(и помните, onPostExecute()
снова запускается в главном потоке пользовательского интерфейса ). Таким образом, вы можете изменить свой пользовательский интерфейс со значением String, которое вы получили от длинной блокирующей операции.
Если вам нужна документация, вот она:
https://developer.android.com/reference/android/os/AsyncTask