Создание и выполнение фонового процесса через AsyncTask

By | 05.03.2014

Фоновые процессы в Android очень распространены. Реализация при помощи AsyncTask довольно простая и понятная для новичков.

Для выполнения процесса в потоке нам нужно создать подкласс в нашем Activity. Есть несколько видов определения класса, рассмотрим примеры:

// Стандартный вид потока
private class testTask extends AsyncTask<Void, Void, Void> {
  @Override
  protected Void doInBackground(Void ... params) {
    // Код, который должен выполняться в потоке
    return null;
  }
}

Вызывается он например в onCreateView таким образом:

testTask task = new testTask();
task.execute();

У данного класса есть ещё один полезный метод onPostExecute, он выполняется после завершения потока. Если обратить внимание на определение класса testTask, можно заметить три обобщённых параметра . Третий параметр определяет тип возвращаемого значения методом doInBackground и тип принимаемого на вход атрибута для метода onPostExecute. Попробуем ими воспользоваться. На примере будет понятней.

private class testTask extends AsyncTask<Void, Void, String> {
  @Override
  protected String doInBackground(Void ... params) {
    // Код, который должен выполняться в потоке
    return "123";
  }
 
  @Override
  protected void onPostExecute(String str) {
    // Выполнение какого-то действия, когда поток выполнится
    // str возвращается нам от doInBackground, т.е. мы в нём должны что-то сделать
    // и вернуть (return) строку (или любой другой тип, включая кастомный объект)
  }
}

Также можно подать на вход потока какую-то информацию через первый обобщённый параметр.

private class testTask extends AsyncTask<String, Void, String> {
  @Override
  protected String doInBackground(String ... params) {
    // Код, который должен выполняться в потоке
    // Мы передаём на вход params, чтобы получить "in_str" напишите params[0]
 
    return "out_string";
  }
 
  @Override
  protected void onPostExecute(String str) {
    // Выполнение какого-то действия, когда поток выполнится
  }
}
 
// Вызываем
testTask task = new testTask();
task.execute("in_str");

Вот собственно и всё. Что с этим делать зависит от Вашей фантазии, например можно получать и парсить данные с какого-то источника через XML в таком потоке и отображать их в ListView или ещё где-то. В этом случае поток нужен, т.к. Android не даст соединиться с сервером в главном потоке.