Использование AsyncTask
Вы можете использовать AsyncTask
.У этого есть 3 шага к этому.
1. onPreExecute()
- что вы хотите сделать перед запуском doInBackground()
.Это происходит в основном потоке пользовательского интерфейса .
2. doInBackground()
- AsyncTask будет выполнять операции в фоновом потоке (фоновый поток создается Android, поэтому вам не нужно об этом беспокоиться).
3. onPostExecute()
- здесь вы можете получить любые данные из метода doInBackground.Метод postExecute выполняется снова в основном потоке пользовательского интерфейса .
Таким образом, вы можете выполнять любые операции ввода-вывода в doInBackground()
и возвращать значение, полученное с сервера или любого другогодругой источник данных, и onPostExecute()
, является эквивалентом блока завершения в swift.
Как объявить
Чтобы использовать AsyncTask
, вам необходимо расширить Android AsyncTask
.
Итак, ваше собственное объявление AsyncTask будет выглядеть так:
private class MyAsyncTask extends AsyncTask<Void, Void, Void> { ... }
Какие 3 общих аргумента вы задаете?
1. Params - тип параметров, отправляемых заданию при выполнении.
2. Progress - тип единиц прогресса, опубликованных в фоновом режимевычисление.(Почти всегда будет Void
, если вы не заботитесь о фактическом ходе операции. Обратите внимание, что это Void
с заглавной буквой, а не void
в качестве типа возврата).
3. Result - тип результата вычисления фона.
Full Example
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()
снова запускается в основном потоке пользовательского интерфейса).Таким образом, вы можете изменить свой пользовательский интерфейс на строковое значение, которое вы получили от длинной операции блокировки.
Если вам нужна документация, вот она:
https://developer.android.com/reference/android/os/AsyncTask
Использование шаблона наблюдателя
Вы также можете использовать шаблон наблюдателя в вашей ситуации.
Создайте интерфейс с методом onSuccess().
Имейте объект, реализующий этот интерфейс, и всякий раз, когда вам это нужно,Вы можете вызвать метод onSuccess()
.
Пример:
public Interface SuccessInterface{
void onSuccess()
}
public class SuccessHandler implements SuccessInterface{
public void onSuccess(){
//success code goes here
}
}
, затем в своем коде создать экземпляр SucessHandler
и вызвать onSuccess()
, когда вам нужно.