В этой статье я расскажу о потоках и AsyncTask.

Я предполагаю, что у вас есть базовые знания о потоках и фоновых задачах.

Что такое поток в Android?

Согласно документации: поток - это поток выполнения в программе. Виртуальная машина Java позволяет приложению иметь несколько потоков выполнения, выполняемых одновременно.

Поток - это независимый путь выполнения в запущенной программе. При запуске приложения основной поток создается сам по себе, что также известно как поток пользовательского интерфейса. Этот поток пользовательского интерфейса заботится о производительности вашего приложения, если вы его перегрузите. с длительно выполняющейся задачей она не будет реагировать на ввод пользователя или рисовать на экране, например, при прокрутке. Следовательно, нам нужно запускать длительные задачи в отдельных потоках, мы можем сделать несколько потоков.

Чтобы наше приложение оставалось плавным и отзывчивым, мы должны избегать использования основного потока пользовательского интерфейса для выполнения каких-либо длительных задач.

Как узнать, выполняет ли мое приложение длительные задачи или нет?

Послушайте, если задача занимает время более 16 миллисекунд, значит, это длительная задача. Некоторые распространенные длительные операции перечислены ниже: -

  1. Сетевые операции
  2. Сложный и долгий расчет
  3. Скачивание / закачка файлов
  4. Обработка данных
  5. Вызовы базы данных

Если мы выполним вышеупомянутую или любую другую длительную операцию в основном потоке пользовательского интерфейса, они будут работать синхронно в нашем приложении, что означает, что наше приложение останется без ответа и зависнет, другими словами, мы не сможем прокручивать или выполнять какие-либо другие действия до тех пор, пока операция завершена. По этой причине необходимо вызывать такие операции в отдельном потоке. В разработке под Android мы используем AsyncTask для создания отдельных потоков для этих длительных операций. Чтобы узнать больше о потоках, посетите Обзор процессов и потоков.

Что такое AsyncTask в Android?

Согласно документации: AsyncTask был предназначен для правильного и простого использования потока пользовательского интерфейса.

Теперь у нас достаточно понимания долгосрочных задач. Чтобы выполнять эти длительные задачи, чтобы наш основной пользовательский интерфейс оставался отзывчивым, android предоставляет класс, известный как AsyncTask. Как обсуждалось выше, AsyncTask отделяет интенсивную или трудоемкую обработку от основного пользовательского интерфейса.

Примечание. Все отдельные потоки в наших приложениях называются асинхронными, это означает, что все отдельные потоки выполняются независимо, в отличие от синхронного.

AsycTask имеет возможность отображать результаты обратно в основном потоке пользовательского интерфейса во время работы или завершения, поэтому мы используем AsyncTask, а не простой класс Thread и runnable().

Создайте подкласс AsyncTask:

AsyncTask - это абстрактный класс, что означает, что вы должны создать подкласс, чтобы использовать его. В Android мы не можем напрямую обновлять основной пользовательский интерфейс, например TextView, из фона, но AsyncTask имеет очень удобный способ связи между фоновым потоком и основным потоком.

AsyncTask имеет 4 метода для обновления пользовательского интерфейса и выполнения фоновых операций.

  • onPreExecute()
  • doInBackground(parms)
  • onProgressUpdate(progress)
  • onPostExecute(result)

Жизненный цикл методов AsycTask:

За исключением doInBackground () всех остальных трех методов в основном потоке пользовательского интерфейса.

Давайте кратко обсудим методы AsyncTask:

Рассмотрим следующий сценарий: когда у вас есть длительные операции, такие как загрузка или скачивание одним нажатием кнопки в вашем приложении. При нажатии этой кнопки на сервер будет сделан запрос, и будет ожидаться ответ. Теперь из-за единственного потока, пока не ожидается ответ, ваш экран пользовательского интерфейса зависает или, другими словами, он не отвечает. мы можем решить эту проблему, выполнив ее в однопоточном AsyncTask, чтобы пользовательский интерфейс оставался отзывчивым.

Мое внимание будет уделено работе методов, используемых в AsyncTask. Параметры внутри AsyncTask будут обсуждаться позже в этой статье.

  • onPreExecute () - этот метод запускается в основном потоке пользовательского интерфейса и используется для выполнения каких-либо действий перед выполнением фоновой операции, например отображения всего, что связано с фоновым потоком. Но в нашем сценарии загрузки файла перед началом загрузки пользователю будет показана пустая полоса прогресса загружаемого файла.

  • doInBackground (parms) - Этот метод известен как сердце AsyncTask, он выполняется в отдельном потоке от основного пользовательского интерфейса. Здесь мы реализуем код для выполнения работы, которая должна выполняться в отдельном потоке. мы не можем заниматься чем-либо, связанным с активностью / фрагментом основного потока, например обновлением любого TextView, ProgressBar и т. д. В нашем сценарии файл запросит и получит ответ о загрузке файла в этом методе.
  • onProgressUpdate (progress…) - Подобно onPreExecute(), , этот метод также вызывается в основном потоке пользовательского интерфейса, и мы используем его для отображения текущих результатов, таких как заполнение строки прогресса при загрузке любого файла, как показано ниже, пользовательский интерфейс обновляется после каждого Выполнено на 1%.

  • onPostExecute (результат) - этот метод вызывается в потоке пользовательского интерфейса, он используется для обновления пользовательского интерфейса после завершения AsyncTask, например, при отображении сообщения об успешно загруженном или загруженном файле.

Ну, это был обзор работы AsyncTask, в котором я показал вам, как файл загружается в backgroud. Теперь мы продолжим более подробно обсуждать его работу.

Параметры AsyncTask:

Кратко обсудим параметры AsyncTask. Эти параметры представляют собой своего рода информацию, которую мы хотели бы предоставить AsyncTask о работе, которую она должна выполнить. Ниже A, B, C указаны три параметра, которые мы можем предоставить AsyncTask.

private class MyTask extends AsyncTask<A, B, C> { ... }

Вы можете столкнуться с проблемами при запоминании этих параметров AsyncTask. Не волнуйтесь, я покажу вам какое-нибудь визуальное представление, которое вам очень поможет.

Давайте будем проще

Я дам графическое представление рассмотренного выше сценария загрузки файла. AsyncTask - это фоновая задача, которая выполняется в фоновом потоке. Он принимает Ввод, выполняет Выполнение и дает Выход.

ie AsyncTask<Input,Progress,Output>

На мой взгляд, основная путаница возникает, когда мы пытаемся запомнить параметры в AsyncTask.
Ключ - Не запоминать.
Если вы можете представить себе, в чем ваша задача на самом деле нужно сделать, тогда написать AsyncTask с правильной подписью будет проще простого.
Просто выясните, какие у вас Ввод, Прогресс и Вывод есть, и вам будет хорошо.

Вот визуализация вышеупомянутого сценария загрузки файла.

Здесь вы можете увидеть, что мы предоставили три различных типа параметров, или вы можете просто сказать часть информации. Первый параметр имеет тип String, который является URL-адресом файла, второй - целое число, которое является прогрессом, а третий - снова String, который является результатом.

Давайте посмотрим, как соотносятся эти параметры:

doInBackground() и _14 _, _ 15_ также связаны, как показано ниже.

Вот простой код этого сценария:

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
      }

}

Это все, что вам нужно знать о фоновых задачах в AsyncTask. Но если у вас возникла путаница, посетите официальную документацию AsyncTask или StackOverFlow в этом Вопросе.

ССЫЛКИ:

Вы можете найти больше в официальной документации Android. Все вышеперечисленные изображения не защищены авторским правом.

Смотрите мои последние вопросы и ответы на StackOverFlow.

ВСЕ ПРАВА ЗАЩИЩЕНЫ