Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Dive Into Android. Выполнение асинхронных задач.

Dive Into Android. Выполнение асинхронных задач.

Avatar for Alex Korovyansky

Alex Korovyansky

October 27, 2013
Tweet

More Decks by Alex Korovyansky

Other Decks in Programming

Transcript

  1. 5 Threads • Thread - поток (или нить), основа параллельного

    выполнения • Каждый поток имеет собственный стек вызовов, атрибуты и локальные переменные • Приложение содержит минимум один поток
  2. 6 Плюсы и минусы • Параллельное выполнение • Решение нескольких

    задач одновременно • Решение задачи за меньшее время • Проблемы синхронизации • Условия гонок • Мертвая блокировка • ...
  3. 7 Синхронизация • «Java Concurrency in Practice» - отличная книга

    по многопоточности в Java • java.util.concurrent - набор классов для реализации многопоточности
  4. 8 Многопоточность Android • Фреймворк скрывает многие проблемы многопоточности •

    В петле сообщения выполняются последовательно • Компоненты UI не могут быть изменены в другом потоке • Android предоставляет хорошие средства для усмирения «диких» потоков
  5. 9 Многопоточность Android • Handler - базовый класс для выполнения

    отложенной операции в петле • Activity - runOnUiThread • View - post, postDelayed • http://d.android.com/resources/ articles/painless-threading.html
  6. 10 • Поток в Java требует достаточное количество ресурсов для

    своей работы • Большое количество потоков отрицательно сказывается на производительности • Для решения этой проблемы используется паттерн «Пул потоков» Пул потоков
  7. 13 AsyncTask • AsyncTask - удобный инструмент для выполнения асинхронных

    задач • Добавлено в Android 1.5 • Основано на пуле потоков • Основная логика в методе doInBackground • http://d.android.com/reference/ android/os/AsyncTask.html
  8. 14 AsyncTask - пример private class DownloadFilesTask extends AsyncTask<URL, Integer,

    Long> { protected Long doInBackground(URL... urls) { int count = urls.length; long totalSize = 0; for (int i = 0; i < count; i++) { totalSize += Downloader.downloadFile(urls[i]); publishProgress((int) ((i / (float) count) * 100)); } return totalSize; } protected void onProgressUpdate(Integer... progress) { setProgressPercent(progress[0]); } protected void onPostExecute(Long result) { showDialog("Downloaded " + result + " bytes"); } } ... new DownloadFilesTask().execute(url1, url2, url3);
  9. 15 AsyncTask - generic type private class MyTask extends AsyncTask<Void,

    Void, Void> { ... } • Три шаблонных параметра: • Parameter - передается при старте • Progress - промежуточный прогресс • Result - результат выполнения • Если вам не нужны параметры:
  10. 16 Запуск AsyncTask • Экземляр AsyncTask должен быть создан в

    петле • execute(Param... params) - запуск AsyncTask • Запуск AsyncTask также должен быть сделан в петле • Не вызывайте onPreExecute, onPostExecute, doInBackround и onProgressUpdate вручную! • Один экзмепляр AsyncTask может быть выполнен только один раз
  11. 17 Отмена AsyncTask • AsyncTask может быть «остановлена» в любой

    момент путем вызова cancel(boolean) • После завершения doInBackground будет вызван onCanceled, а не onPostExecute • isCanceled будет возвращать true
  12. 19 Рекомендации • Inverse Of Control - фреймворк определяет ход

    выполнения приложения, а программист переопределяет callbacks • Используете Service как основу выполнения асинхронных операций (неважно в связке с AsyncTask или нет) • Не выполняйте в главном потоке «долгие» операции • Наличие AsyncTask в Activity не влияет на приоритет