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

Последовательно о параллельности в Android

Последовательно о параллельности в Android

Рассказал о том, как выполнять асинхронные задачи в Android

Zhanibek Marshal

December 03, 2016
Tweet

More Decks by Zhanibek Marshal

Other Decks in Programming

Transcript

  1. Зачем нужна параллельность Загрузка данных из DB • Обращение к

    флэш памяти телефона это долго Обработка картинок • Большой размер картинки • Большинство алгоритмов работы с картинками квадратны и более Долгие циклы • Везде где N стоит задуматься
  2. Главный(UI) Поток Процесс Главный поток System events Input events Application

    Service Alarm UI Drawing • Ваш код выполняется между этими событиями
  3. UI Drawing • Больше работы на UI потоке - приложение

    упустит шанс отрисовать следующий кадр (Skipped frame) • Вся суть работы с потоками на Android заключаются в этом 11-28 17:41:27.426 13390-13412/system_process I/Choreographer: Skipped 604 frames! The application may be doing too much work on its main thread.
  4. Thread • Thread выполняет 3 вещи: 1. начать 2. выполнить

    какую нибудь работу 3. закончить
  5. Удобные классы для работы с потоками • AsyncTask - работа

    вне главного потока и возврат результата обратно к нему • HandlerThread - Looper • IntentService - когда не нужен главный поток • Loader - такой же как AsyncTask, но лучше
  6. HandlerThread • HandlerThread не умрет пока не вызовите quit() •

    Позволяет избегать race condition • Выполняет работу по очереди
  7. AsyncTask • onPreExecute - подготовка перед началом • doInBackground -

    выполняем работу вне главного потока • onPostExecute - отображение полученного результата onPreExecute() doInBackground() onPostExecute() onProgressUpdate()
  8. Loader • Выживают при изменении конфигурации • Не зависают все

    время в системе • Кэширование результатов
  9. Самое важное в Loader • onCreateLoader - где нужно создавать

    объект Loader • onLoadFinished - отображаем результат • onLoaderReset - в случае вызова restart LoaderManager.LoaderCallback
  10. Единственное но • Вызывается когда Loader завершил свою работу •

    Нельзя вызывать 
 FragmentTransaction#commit 
 во время этого вызова, так как метод может вызваться 
 после сохранения состоянии Activity