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

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

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

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 не влияет на приоритет