SlideShare ist ein Scribd-Unternehmen logo
1 von 20
Downloaden Sie, um offline zu lesen
Многопоточность.
Работа с сетью.
У каждого android-приложения есть свой
главный поток (UI Thread)
● В нем выполняются операции жизненного цикла activity, отрисовки
интерфейса, обработка событий от пользователя и т.д
● Графический интерфейс является потоко-небезопасным. Попытка
вызвать методы View не из главного потока приводит к исключению
● Если какая-нибудь операция выполняется в главномпотоке более 5
секунд, то появится ANR (Application Not Responding) диалог, с
предложением пользователю убить ваше приложение =(
Начиная с Android 3.0 появился StrictMode, который валит приложение,
если разработчик сделал что-то не так. Полез в интернет из главного
потока? Захотел прочитать файл? Получай исключение!
Мораль
Ни когда не выполняйте долгих операций в главном потоке!
Механизмы для асинхронного поведения
● Thread/Executor т.е все что есть в Java.
● Handler - позволяет работать с очередью сообщений,
ассоциированной с потоком.
● AsyncTask - наверное, самый часто используемый компонент для
создания асинхронного поведения
● Service/IntentService - не имеют ui, работают как фоновые процессы
● Loader - еще один механизм для запуска асинхронных задач,
появился с API level 11
Handler
AsyncTask
Очень часто задача, предполагающая асинхронность выглядит так:
1. Сделать что то в UI потоке, например вывести диалог начала загрузки
2. Начать выполнять задачу в background поток, походу выполнения,
может быть, что-то обновлять в UI потоке (например статус прогресса
загрузки)
3. По завершению загрузки, что-то сделать в UI потоке, например
вывести диалог о удачном завершении задачи.
AsyncTask
AsyncTask
AsyncTask
В зависимости от версии android-а execute() для AsyncTask будет
работать по разному:
● 1.6 < API < 3.2 — на запуск новой AsyncTask будет выделяться новый
поток
● API ≥ 3.2 — на запуск всех AsyncTask используется по умолчанию
один поток, но добавили поле AsyncTask.THREAD_POOL_EXECUTOR
Service
● Появились в API 11 (Android 3.0)
● Привязаны к методам жизненного цикла activity или fragment-а
● Крайне рекомендуется использовать только с cursor-ми (Cursor loader)
Loader
Основные компоненты
● LoaderManager - управляет Loader-ами (создает, уничтожает,
стартует)
● LoaderManager.LoaderCallabacks - интерфейс для связи клиента и
менеджера
● Loader - объект, асинхронно выполняющий задачу
Работа с сетью
● Чаще всего под работой с сетью подразумевают взаимодействие с
REST-подобными сервисами т.е это HTTP + JSON/XML
● Для доступа в сеть в вашем манифесте должен быть прописан
android.permission.INTERNET
● Для отображения web-страниц в вашем приложении можно
использовать WebView - практически полноценный браузер
Стандартные средства
● HttpClient
● HttpUrlConnection
● OkHttp / Retrofit
Типичный use-case
• Создаем HttpClient (DefaultHttpClient или AndroidHttpClient)
• Создаем и настраиваем запрос – объект класса HttpUriRequest (обычно
HttpGet или HttpPost)
• Выполняем запрос HttpClient.execute и получаем в
ответ HttpResponse
• Разбираем HttpResponse – хедеры, строку ответа и т.д.
• Получаем HttpEntity и разбираем тело ответа
HttpClient
HttpUrlConnection
Типичный use-case
• Создаем объект URL, зовем openConnection() и кастуем
к HttpURLConnection
• Подготавливаем запрос – устанавливаем хедеры,
параметры запроса, тип контента и т.д.
• По необходимости подготавливаем тело запроса (POST
запрос). setDoOutput(true) и getOutputStream()
• Читаем ответ сервера. Строку ответа (код, сообщение),
хедеры, cookie и т.д.
• Закрываем соединение и освобождаем все ресурсы
• Ребята из android команды утверждают, что и там и там
есть куча багов
• В android 2.3+ багов меньше в HttpUrlConnection
• В предыдущих версиях – в HttpClient
• О каких именно багах идет речь – да кто бы знал
• С HttpClient’ом приятнее работать
HttpUrlConnection vs HttpClient
● OkHttp - библиотека для работы с http от компании Square.
● Retrofit - библиотека для работы с REST API от компании Square, на
Android по умолчанию использует HttpUrlConnection, но лучше
подключать OkHttp из-за ошибок в последнем.
OkHttp / Retrofit
Проблемы
1. Асинхронность через callback-и очень скоро порождает высокую
степень вложенности (AsyncTask-а в AsyncTask-e), что резко снижает
читабельность и сопровождаемость кода.
2. Кроме REST API, нам также постоянно приходится скачивать картинки
и делать это приходится в adapter-ах к ListView.
3. Почти к любому backend-у необходимо выстраивать кэш на стороне
приложения.
4. Часто результат выполнения сетевых запросов нужен не только в том
месте, откуда они были вызваны
Решения
1. Netflix/rxJava
2. Square/picasso
3. ??? (ORM*, сохранние json/xml в файлы, черт знает что еще)
4. Square/Otto
1. http://www.slideshare.net/andersgoransson/efficient-android-threading -
презентация по асинхронности (лучше этой)
2. http://www.vogella.com/tutorials/AndroidServices/article.html - более
подробно про Service
3. https://github.com/Netflix/RxJava - библиотека для “реактивного”
программирования на Java
4. https://github.com/square/picasso - android библиотека для загрузки
изображений из сети
5. https://github.com/square/retrofit - библиотека для работы с REST API
6. https://github.com/noveogroup/university-android-task6 - примеры по ходу
текущей лекции
7. https://github.com/tttzof351/SmsReader - пример с loader-ом
Что еще почитать/посмотреть?
1. Реализовать экран StudentTaskActivity, показывающий список*
заголовков новостей http://androidtraining.noveogroup.com/news/getAll
2. Пока новости загружаются, пользователю должен быть показан
ProgressDialog
3. Использовать AsyncTask или Service для реализации асинхронного
поведения
4. Формат ответов можно посмотреть http://androidtraining.noveogroup.
com/main/requestFormat
* Можно так же показывать в элементах списка картинки, используя
square/picasso
Задание

Weitere ähnliche Inhalte

Was ist angesagt?

Multithreading in java past and actual
Multithreading in java past and actualMultithreading in java past and actual
Multithreading in java past and actualYevgen Levik
 
Оптимизация трассирования с использованием Expression templates
Оптимизация трассирования с использованием Expression templatesОптимизация трассирования с использованием Expression templates
Оптимизация трассирования с использованием Expression templatesPlatonov Sergey
 
Артем Розуменко - "Как и зачем разрабатывать собственный фреймворк?"
Артем Розуменко - "Как и зачем разрабатывать собственный фреймворк?"Артем Розуменко - "Как и зачем разрабатывать собственный фреймворк?"
Артем Розуменко - "Как и зачем разрабатывать собственный фреймворк?"QA Dnepropetrovsk Community (Ukraine)
 
Практика Lock-free. RealTime-сервер
Практика Lock-free. RealTime-серверПрактика Lock-free. RealTime-сервер
Практика Lock-free. RealTime-серверPlatonov Sergey
 
Everything you wanted to know about writing async, high-concurrency HTTP apps...
Everything you wanted to know about writing async, high-concurrency HTTP apps...Everything you wanted to know about writing async, high-concurrency HTTP apps...
Everything you wanted to know about writing async, high-concurrency HTTP apps...JavaDayUA
 
Быстрое прототипирование бэкенда игры с геолокацией на OpenResty, Redis и Doc...
Быстрое прототипирование бэкенда игры с геолокацией на OpenResty, Redis и Doc...Быстрое прототипирование бэкенда игры с геолокацией на OpenResty, Redis и Doc...
Быстрое прототипирование бэкенда игры с геолокацией на OpenResty, Redis и Doc...Ontico
 
RDSDataSource: Чистые тесты на Swift
RDSDataSource: Чистые тесты на SwiftRDSDataSource: Чистые тесты на Swift
RDSDataSource: Чистые тесты на SwiftRAMBLER&Co
 
Svitla .Net meetup in Kiev, Anzhiiak Oleksii
Svitla .Net meetup in Kiev, Anzhiiak OleksiiSvitla .Net meetup in Kiev, Anzhiiak Oleksii
Svitla .Net meetup in Kiev, Anzhiiak OleksiiSvitla Systems Inc.
 
Про асинхронное сетевое программирование
Про асинхронное сетевое программированиеПро асинхронное сетевое программирование
Про асинхронное сетевое программированиеPython Meetup
 
implementation of 'go'-like language constructions in scala (russian)
implementation of 'go'-like language constructions in scala (russian)implementation of 'go'-like language constructions in scala (russian)
implementation of 'go'-like language constructions in scala (russian)Ruslan Shevchenko
 
Нагрузочное тестирование JMeter Кожухов
Нагрузочное тестирование JMeter КожуховНагрузочное тестирование JMeter Кожухов
Нагрузочное тестирование JMeter КожуховИлья Кожухов
 
Тестирование отклика Web-интерфейса с JMeter и Selenium
Тестирование отклика Web-интерфейса с JMeter и SeleniumТестирование отклика Web-интерфейса с JMeter и Selenium
Тестирование отклика Web-интерфейса с JMeter и SeleniumSQALab
 
Testing with Selenium
Testing with SeleniumTesting with Selenium
Testing with SeleniumOSLL
 
Android осень 2013 лекция 4
Android осень 2013 лекция 4Android осень 2013 лекция 4
Android осень 2013 лекция 4Technopark
 
JMeter и OutOfMemory. Исследовательский доклад
JMeter и OutOfMemory. Исследовательский докладJMeter и OutOfMemory. Исследовательский доклад
JMeter и OutOfMemory. Исследовательский докладSQALab
 
Профилирование кода на C/C++ в *nix системах
Профилирование кода на C/C++ в *nix системахПрофилирование кода на C/C++ в *nix системах
Профилирование кода на C/C++ в *nix системахAleksander Alekseev
 

Was ist angesagt? (20)

Multithreading in java past and actual
Multithreading in java past and actualMultithreading in java past and actual
Multithreading in java past and actual
 
Оптимизация трассирования с использованием Expression templates
Оптимизация трассирования с использованием Expression templatesОптимизация трассирования с использованием Expression templates
Оптимизация трассирования с использованием Expression templates
 
Артем Розуменко - "Как и зачем разрабатывать собственный фреймворк?"
Артем Розуменко - "Как и зачем разрабатывать собственный фреймворк?"Артем Розуменко - "Как и зачем разрабатывать собственный фреймворк?"
Артем Розуменко - "Как и зачем разрабатывать собственный фреймворк?"
 
Практика Lock-free. RealTime-сервер
Практика Lock-free. RealTime-серверПрактика Lock-free. RealTime-сервер
Практика Lock-free. RealTime-сервер
 
Everything you wanted to know about writing async, high-concurrency HTTP apps...
Everything you wanted to know about writing async, high-concurrency HTTP apps...Everything you wanted to know about writing async, high-concurrency HTTP apps...
Everything you wanted to know about writing async, high-concurrency HTTP apps...
 
Быстрое прототипирование бэкенда игры с геолокацией на OpenResty, Redis и Doc...
Быстрое прототипирование бэкенда игры с геолокацией на OpenResty, Redis и Doc...Быстрое прототипирование бэкенда игры с геолокацией на OpenResty, Redis и Doc...
Быстрое прототипирование бэкенда игры с геолокацией на OpenResty, Redis и Doc...
 
Practical usage of RxJava 2
Practical usage of RxJava 2Practical usage of RxJava 2
Practical usage of RxJava 2
 
Java 8. Thread pools
Java 8. Thread poolsJava 8. Thread pools
Java 8. Thread pools
 
RDSDataSource: Чистые тесты на Swift
RDSDataSource: Чистые тесты на SwiftRDSDataSource: Чистые тесты на Swift
RDSDataSource: Чистые тесты на Swift
 
Svitla .Net meetup in Kiev, Anzhiiak Oleksii
Svitla .Net meetup in Kiev, Anzhiiak OleksiiSvitla .Net meetup in Kiev, Anzhiiak Oleksii
Svitla .Net meetup in Kiev, Anzhiiak Oleksii
 
Про асинхронное сетевое программирование
Про асинхронное сетевое программированиеПро асинхронное сетевое программирование
Про асинхронное сетевое программирование
 
implementation of 'go'-like language constructions in scala (russian)
implementation of 'go'-like language constructions in scala (russian)implementation of 'go'-like language constructions in scala (russian)
implementation of 'go'-like language constructions in scala (russian)
 
Нагрузочное тестирование JMeter Кожухов
Нагрузочное тестирование JMeter КожуховНагрузочное тестирование JMeter Кожухов
Нагрузочное тестирование JMeter Кожухов
 
Тестирование отклика Web-интерфейса с JMeter и Selenium
Тестирование отклика Web-интерфейса с JMeter и SeleniumТестирование отклика Web-интерфейса с JMeter и Selenium
Тестирование отклика Web-интерфейса с JMeter и Selenium
 
JavaDay'14
JavaDay'14JavaDay'14
JavaDay'14
 
Testing with Selenium
Testing with SeleniumTesting with Selenium
Testing with Selenium
 
Java threads - part 1
Java threads - part 1Java threads - part 1
Java threads - part 1
 
Android осень 2013 лекция 4
Android осень 2013 лекция 4Android осень 2013 лекция 4
Android осень 2013 лекция 4
 
JMeter и OutOfMemory. Исследовательский доклад
JMeter и OutOfMemory. Исследовательский докладJMeter и OutOfMemory. Исследовательский доклад
JMeter и OutOfMemory. Исследовательский доклад
 
Профилирование кода на C/C++ в *nix системах
Профилирование кода на C/C++ в *nix системахПрофилирование кода на C/C++ в *nix системах
Профилирование кода на C/C++ в *nix системах
 

Ähnlich wie Android - 11 - Multithreading

Android осень 2013 лекция 3
Android осень 2013 лекция 3Android осень 2013 лекция 3
Android осень 2013 лекция 3Technopark
 
развертывание среды Rails (антон веснин, Locum Ru)
развертывание среды Rails (антон веснин, Locum Ru)развертывание среды Rails (антон веснин, Locum Ru)
развертывание среды Rails (антон веснин, Locum Ru)guest40e031
 
антон веснин Rails Application Servers
антон веснин Rails Application Serversантон веснин Rails Application Servers
антон веснин Rails Application Serversrit2010
 
Java весна 2014 лекция 5
Java весна 2014 лекция 5Java весна 2014 лекция 5
Java весна 2014 лекция 5Technopark
 
Другая виртуализация
Другая виртуализацияДругая виртуализация
Другая виртуализацияYandex
 
Асинхронность и сопрограммы
Асинхронность и сопрограммыАсинхронность и сопрограммы
Асинхронность и сопрограммыPlatonov Sergey
 
Воюем за ресурсы (ZFConf2011)
Воюем за ресурсы (ZFConf2011)Воюем за ресурсы (ZFConf2011)
Воюем за ресурсы (ZFConf2011)Alexey Kachayev
 
OpenStack - Python Project with 12 Million Lines of code (RUS, Moscow Python ...
OpenStack - Python Project with 12 Million Lines of code (RUS, Moscow Python ...OpenStack - Python Project with 12 Million Lines of code (RUS, Moscow Python ...
OpenStack - Python Project with 12 Million Lines of code (RUS, Moscow Python ...Vadim Ponomarev
 
ZFConf 2011: Воюем за ресурсы: Повышение производительности Zend Framework пр...
ZFConf 2011: Воюем за ресурсы: Повышение производительности Zend Framework пр...ZFConf 2011: Воюем за ресурсы: Повышение производительности Zend Framework пр...
ZFConf 2011: Воюем за ресурсы: Повышение производительности Zend Framework пр...ZFConf Conference
 
noBackend, или Как выжить в эпоху толстеющих клиентов / Самохвалов Николай
noBackend, или Как выжить в эпоху толстеющих клиентов / Самохвалов НиколайnoBackend, или Как выжить в эпоху толстеющих клиентов / Самохвалов Николай
noBackend, или Как выжить в эпоху толстеющих клиентов / Самохвалов НиколайOntico
 
Разработка сетевых приложений с gevent
Разработка сетевых приложений с geventРазработка сетевых приложений с gevent
Разработка сетевых приложений с geventAndrey Popp
 
В поисках эффективного middleware
В поисках эффективного middlewareВ поисках эффективного middleware
В поисках эффективного middlewareAlexander Gerasiov
 
#noBackend, или Как выжить в эпоху толстеющих клиентов
#noBackend, или Как выжить в эпоху толстеющих клиентов#noBackend, или Как выжить в эпоху толстеющих клиентов
#noBackend, или Как выжить в эпоху толстеющих клиентовNikolay Samokhvalov
 
мониторинг производительности приложения на PINBA
мониторинг производительности приложения на PINBAмониторинг производительности приложения на PINBA
мониторинг производительности приложения на PINBASlach
 
Процессы разработки в Яндексе
Процессы разработки в ЯндексеПроцессы разработки в Яндексе
Процессы разработки в ЯндексеAndrey Kazarinov
 

Ähnlich wie Android - 11 - Multithreading (20)

Async Python
Async PythonAsync Python
Async Python
 
Android осень 2013 лекция 3
Android осень 2013 лекция 3Android осень 2013 лекция 3
Android осень 2013 лекция 3
 
развертывание среды Rails (антон веснин, Locum Ru)
развертывание среды Rails (антон веснин, Locum Ru)развертывание среды Rails (антон веснин, Locum Ru)
развертывание среды Rails (антон веснин, Locum Ru)
 
антон веснин Rails Application Servers
антон веснин Rails Application Serversантон веснин Rails Application Servers
антон веснин Rails Application Servers
 
Java весна 2014 лекция 5
Java весна 2014 лекция 5Java весна 2014 лекция 5
Java весна 2014 лекция 5
 
Другая виртуализация
Другая виртуализацияДругая виртуализация
Другая виртуализация
 
Асинхронность и сопрограммы
Асинхронность и сопрограммыАсинхронность и сопрограммы
Асинхронность и сопрограммы
 
Воюем за ресурсы (ZFConf2011)
Воюем за ресурсы (ZFConf2011)Воюем за ресурсы (ZFConf2011)
Воюем за ресурсы (ZFConf2011)
 
OpenStack - Python Project with 12 Million Lines of code (RUS, Moscow Python ...
OpenStack - Python Project with 12 Million Lines of code (RUS, Moscow Python ...OpenStack - Python Project with 12 Million Lines of code (RUS, Moscow Python ...
OpenStack - Python Project with 12 Million Lines of code (RUS, Moscow Python ...
 
Веб-сервер
Веб-серверВеб-сервер
Веб-сервер
 
ZFConf 2011: Воюем за ресурсы: Повышение производительности Zend Framework пр...
ZFConf 2011: Воюем за ресурсы: Повышение производительности Zend Framework пр...ZFConf 2011: Воюем за ресурсы: Повышение производительности Zend Framework пр...
ZFConf 2011: Воюем за ресурсы: Повышение производительности Zend Framework пр...
 
YaC 2013 Notes
YaC 2013 NotesYaC 2013 Notes
YaC 2013 Notes
 
noBackend, или Как выжить в эпоху толстеющих клиентов / Самохвалов Николай
noBackend, или Как выжить в эпоху толстеющих клиентов / Самохвалов НиколайnoBackend, или Как выжить в эпоху толстеющих клиентов / Самохвалов Николай
noBackend, или Как выжить в эпоху толстеющих клиентов / Самохвалов Николай
 
Разработка сетевых приложений с gevent
Разработка сетевых приложений с geventРазработка сетевых приложений с gevent
Разработка сетевых приложений с gevent
 
В поисках эффективного middleware
В поисках эффективного middlewareВ поисках эффективного middleware
В поисках эффективного middleware
 
#noBackend, или Как выжить в эпоху толстеющих клиентов
#noBackend, или Как выжить в эпоху толстеющих клиентов#noBackend, или Как выжить в эпоху толстеющих клиентов
#noBackend, или Как выжить в эпоху толстеющих клиентов
 
мониторинг производительности приложения на PINBA
мониторинг производительности приложения на PINBAмониторинг производительности приложения на PINBA
мониторинг производительности приложения на PINBA
 
Async
AsyncAsync
Async
 
Luxoft async.net
Luxoft async.netLuxoft async.net
Luxoft async.net
 
Процессы разработки в Яндексе
Процессы разработки в ЯндексеПроцессы разработки в Яндексе
Процессы разработки в Яндексе
 

Mehr von Noveo

Гуманитарные специальности в IT-индустрии
Гуманитарные специальности в IT-индустрииГуманитарные специальности в IT-индустрии
Гуманитарные специальности в IT-индустрииNoveo
 
Box model, display and position (HTML5 тема 07 - box model, display position)
Box model, display and position (HTML5 тема 07 - box model, display position)Box model, display and position (HTML5 тема 07 - box model, display position)
Box model, display and position (HTML5 тема 07 - box model, display position)Noveo
 
Ссылки, списки и меню (HTML5 тема 06 - ссылки, списки и меню)
Ссылки, списки и меню (HTML5 тема 06 - ссылки, списки и меню)Ссылки, списки и меню (HTML5 тема 06 - ссылки, списки и меню)
Ссылки, списки и меню (HTML5 тема 06 - ссылки, списки и меню)Noveo
 
Стилизация текста (HTML5 тема 05 - стилизация текста)
Стилизация текста (HTML5 тема 05 - стилизация текста)Стилизация текста (HTML5 тема 05 - стилизация текста)
Стилизация текста (HTML5 тема 05 - стилизация текста)Noveo
 
Семантика текста (HTML5 тема 04 - семантика текста)
Семантика текста (HTML5 тема 04 - семантика текста)Семантика текста (HTML5 тема 04 - семантика текста)
Семантика текста (HTML5 тема 04 - семантика текста)Noveo
 
Основы CSS (HTML5 тема 02 - основы CSS)
Основы CSS (HTML5 тема 02 - основы CSS)Основы CSS (HTML5 тема 02 - основы CSS)
Основы CSS (HTML5 тема 02 - основы CSS)Noveo
 
Структура HTML документа (HTML5 тема 01 - структура html документа)
Структура HTML документа (HTML5 тема 01 - структура html документа)Структура HTML документа (HTML5 тема 01 - структура html документа)
Структура HTML документа (HTML5 тема 01 - структура html документа)Noveo
 
Yii2
Yii2Yii2
Yii2Noveo
 
Сессии и авторизация
Сессии и авторизацияСессии и авторизация
Сессии и авторизацияNoveo
 
Rest
RestRest
RestNoveo
 
PHP basic
PHP basicPHP basic
PHP basicNoveo
 
PHP Advanced
PHP AdvancedPHP Advanced
PHP AdvancedNoveo
 
PHP and MySQL
PHP and MySQLPHP and MySQL
PHP and MySQLNoveo
 
MySQL
MySQLMySQL
MySQLNoveo
 
Push Notifications (Lecture 22 – push notifications)
Push Notifications (Lecture 22 – push notifications)Push Notifications (Lecture 22 – push notifications)
Push Notifications (Lecture 22 – push notifications)Noveo
 
RxJava+RxAndroid (Lecture 20 – rx java)
RxJava+RxAndroid (Lecture 20 – rx java)RxJava+RxAndroid (Lecture 20 – rx java)
RxJava+RxAndroid (Lecture 20 – rx java)Noveo
 
Работа с соцсетями (Lecture 19 – social)
Работа с соцсетями (Lecture 19 – social)Работа с соцсетями (Lecture 19 – social)
Работа с соцсетями (Lecture 19 – social)Noveo
 
Работа с геоданными (Lecture 18 – geolocation)
Работа с геоданными (Lecture 18 – geolocation)Работа с геоданными (Lecture 18 – geolocation)
Работа с геоданными (Lecture 18 – geolocation)Noveo
 
Animations (Lecture 17 – animations)
Animations (Lecture 17 – animations)Animations (Lecture 17 – animations)
Animations (Lecture 17 – animations)Noveo
 
Toolbar (Lecture 16 – toolbar)
Toolbar (Lecture 16 – toolbar)Toolbar (Lecture 16 – toolbar)
Toolbar (Lecture 16 – toolbar)Noveo
 

Mehr von Noveo (20)

Гуманитарные специальности в IT-индустрии
Гуманитарные специальности в IT-индустрииГуманитарные специальности в IT-индустрии
Гуманитарные специальности в IT-индустрии
 
Box model, display and position (HTML5 тема 07 - box model, display position)
Box model, display and position (HTML5 тема 07 - box model, display position)Box model, display and position (HTML5 тема 07 - box model, display position)
Box model, display and position (HTML5 тема 07 - box model, display position)
 
Ссылки, списки и меню (HTML5 тема 06 - ссылки, списки и меню)
Ссылки, списки и меню (HTML5 тема 06 - ссылки, списки и меню)Ссылки, списки и меню (HTML5 тема 06 - ссылки, списки и меню)
Ссылки, списки и меню (HTML5 тема 06 - ссылки, списки и меню)
 
Стилизация текста (HTML5 тема 05 - стилизация текста)
Стилизация текста (HTML5 тема 05 - стилизация текста)Стилизация текста (HTML5 тема 05 - стилизация текста)
Стилизация текста (HTML5 тема 05 - стилизация текста)
 
Семантика текста (HTML5 тема 04 - семантика текста)
Семантика текста (HTML5 тема 04 - семантика текста)Семантика текста (HTML5 тема 04 - семантика текста)
Семантика текста (HTML5 тема 04 - семантика текста)
 
Основы CSS (HTML5 тема 02 - основы CSS)
Основы CSS (HTML5 тема 02 - основы CSS)Основы CSS (HTML5 тема 02 - основы CSS)
Основы CSS (HTML5 тема 02 - основы CSS)
 
Структура HTML документа (HTML5 тема 01 - структура html документа)
Структура HTML документа (HTML5 тема 01 - структура html документа)Структура HTML документа (HTML5 тема 01 - структура html документа)
Структура HTML документа (HTML5 тема 01 - структура html документа)
 
Yii2
Yii2Yii2
Yii2
 
Сессии и авторизация
Сессии и авторизацияСессии и авторизация
Сессии и авторизация
 
Rest
RestRest
Rest
 
PHP basic
PHP basicPHP basic
PHP basic
 
PHP Advanced
PHP AdvancedPHP Advanced
PHP Advanced
 
PHP and MySQL
PHP and MySQLPHP and MySQL
PHP and MySQL
 
MySQL
MySQLMySQL
MySQL
 
Push Notifications (Lecture 22 – push notifications)
Push Notifications (Lecture 22 – push notifications)Push Notifications (Lecture 22 – push notifications)
Push Notifications (Lecture 22 – push notifications)
 
RxJava+RxAndroid (Lecture 20 – rx java)
RxJava+RxAndroid (Lecture 20 – rx java)RxJava+RxAndroid (Lecture 20 – rx java)
RxJava+RxAndroid (Lecture 20 – rx java)
 
Работа с соцсетями (Lecture 19 – social)
Работа с соцсетями (Lecture 19 – social)Работа с соцсетями (Lecture 19 – social)
Работа с соцсетями (Lecture 19 – social)
 
Работа с геоданными (Lecture 18 – geolocation)
Работа с геоданными (Lecture 18 – geolocation)Работа с геоданными (Lecture 18 – geolocation)
Работа с геоданными (Lecture 18 – geolocation)
 
Animations (Lecture 17 – animations)
Animations (Lecture 17 – animations)Animations (Lecture 17 – animations)
Animations (Lecture 17 – animations)
 
Toolbar (Lecture 16 – toolbar)
Toolbar (Lecture 16 – toolbar)Toolbar (Lecture 16 – toolbar)
Toolbar (Lecture 16 – toolbar)
 

Android - 11 - Multithreading

  • 2. У каждого android-приложения есть свой главный поток (UI Thread) ● В нем выполняются операции жизненного цикла activity, отрисовки интерфейса, обработка событий от пользователя и т.д ● Графический интерфейс является потоко-небезопасным. Попытка вызвать методы View не из главного потока приводит к исключению ● Если какая-нибудь операция выполняется в главномпотоке более 5 секунд, то появится ANR (Application Not Responding) диалог, с предложением пользователю убить ваше приложение =(
  • 3. Начиная с Android 3.0 появился StrictMode, который валит приложение, если разработчик сделал что-то не так. Полез в интернет из главного потока? Захотел прочитать файл? Получай исключение! Мораль Ни когда не выполняйте долгих операций в главном потоке!
  • 4.
  • 5. Механизмы для асинхронного поведения ● Thread/Executor т.е все что есть в Java. ● Handler - позволяет работать с очередью сообщений, ассоциированной с потоком. ● AsyncTask - наверное, самый часто используемый компонент для создания асинхронного поведения ● Service/IntentService - не имеют ui, работают как фоновые процессы ● Loader - еще один механизм для запуска асинхронных задач, появился с API level 11
  • 7. AsyncTask Очень часто задача, предполагающая асинхронность выглядит так: 1. Сделать что то в UI потоке, например вывести диалог начала загрузки 2. Начать выполнять задачу в background поток, походу выполнения, может быть, что-то обновлять в UI потоке (например статус прогресса загрузки) 3. По завершению загрузки, что-то сделать в UI потоке, например вывести диалог о удачном завершении задачи.
  • 10. AsyncTask В зависимости от версии android-а execute() для AsyncTask будет работать по разному: ● 1.6 < API < 3.2 — на запуск новой AsyncTask будет выделяться новый поток ● API ≥ 3.2 — на запуск всех AsyncTask используется по умолчанию один поток, но добавили поле AsyncTask.THREAD_POOL_EXECUTOR
  • 12. ● Появились в API 11 (Android 3.0) ● Привязаны к методам жизненного цикла activity или fragment-а ● Крайне рекомендуется использовать только с cursor-ми (Cursor loader) Loader Основные компоненты ● LoaderManager - управляет Loader-ами (создает, уничтожает, стартует) ● LoaderManager.LoaderCallabacks - интерфейс для связи клиента и менеджера ● Loader - объект, асинхронно выполняющий задачу
  • 13. Работа с сетью ● Чаще всего под работой с сетью подразумевают взаимодействие с REST-подобными сервисами т.е это HTTP + JSON/XML ● Для доступа в сеть в вашем манифесте должен быть прописан android.permission.INTERNET ● Для отображения web-страниц в вашем приложении можно использовать WebView - практически полноценный браузер Стандартные средства ● HttpClient ● HttpUrlConnection ● OkHttp / Retrofit
  • 14. Типичный use-case • Создаем HttpClient (DefaultHttpClient или AndroidHttpClient) • Создаем и настраиваем запрос – объект класса HttpUriRequest (обычно HttpGet или HttpPost) • Выполняем запрос HttpClient.execute и получаем в ответ HttpResponse • Разбираем HttpResponse – хедеры, строку ответа и т.д. • Получаем HttpEntity и разбираем тело ответа HttpClient
  • 15. HttpUrlConnection Типичный use-case • Создаем объект URL, зовем openConnection() и кастуем к HttpURLConnection • Подготавливаем запрос – устанавливаем хедеры, параметры запроса, тип контента и т.д. • По необходимости подготавливаем тело запроса (POST запрос). setDoOutput(true) и getOutputStream() • Читаем ответ сервера. Строку ответа (код, сообщение), хедеры, cookie и т.д. • Закрываем соединение и освобождаем все ресурсы
  • 16. • Ребята из android команды утверждают, что и там и там есть куча багов • В android 2.3+ багов меньше в HttpUrlConnection • В предыдущих версиях – в HttpClient • О каких именно багах идет речь – да кто бы знал • С HttpClient’ом приятнее работать HttpUrlConnection vs HttpClient
  • 17. ● OkHttp - библиотека для работы с http от компании Square. ● Retrofit - библиотека для работы с REST API от компании Square, на Android по умолчанию использует HttpUrlConnection, но лучше подключать OkHttp из-за ошибок в последнем. OkHttp / Retrofit
  • 18. Проблемы 1. Асинхронность через callback-и очень скоро порождает высокую степень вложенности (AsyncTask-а в AsyncTask-e), что резко снижает читабельность и сопровождаемость кода. 2. Кроме REST API, нам также постоянно приходится скачивать картинки и делать это приходится в adapter-ах к ListView. 3. Почти к любому backend-у необходимо выстраивать кэш на стороне приложения. 4. Часто результат выполнения сетевых запросов нужен не только в том месте, откуда они были вызваны Решения 1. Netflix/rxJava 2. Square/picasso 3. ??? (ORM*, сохранние json/xml в файлы, черт знает что еще) 4. Square/Otto
  • 19. 1. http://www.slideshare.net/andersgoransson/efficient-android-threading - презентация по асинхронности (лучше этой) 2. http://www.vogella.com/tutorials/AndroidServices/article.html - более подробно про Service 3. https://github.com/Netflix/RxJava - библиотека для “реактивного” программирования на Java 4. https://github.com/square/picasso - android библиотека для загрузки изображений из сети 5. https://github.com/square/retrofit - библиотека для работы с REST API 6. https://github.com/noveogroup/university-android-task6 - примеры по ходу текущей лекции 7. https://github.com/tttzof351/SmsReader - пример с loader-ом Что еще почитать/посмотреть?
  • 20. 1. Реализовать экран StudentTaskActivity, показывающий список* заголовков новостей http://androidtraining.noveogroup.com/news/getAll 2. Пока новости загружаются, пользователю должен быть показан ProgressDialog 3. Использовать AsyncTask или Service для реализации асинхронного поведения 4. Формат ответов можно посмотреть http://androidtraining.noveogroup. com/main/requestFormat * Можно так же показывать в элементах списка картинки, используя square/picasso Задание