Android - 11 - Multithreading

20

Click here to load reader

description

Multithreading

Transcript of Android - 11 - Multithreading

Page 1: Android - 11 - Multithreading

Многопоточность.Работа с сетью.

Page 2: Android - 11 - Multithreading

У каждого android-приложения есть свой главный поток (UI Thread)● В нем выполняются операции жизненного цикла activity, отрисовки

интерфейса, обработка событий от пользователя и т.д

● Графический интерфейс является потоко-небезопасным. Попытка вызвать методы View не из главного потока приводит к исключению

● Если какая-нибудь операция выполняется в главномпотоке более 5 секунд, то появится ANR (Application Not Responding) диалог, с предложением пользователю убить ваше приложение =(

Page 3: Android - 11 - Multithreading

Начиная с Android 3.0 появился StrictMode, который валит приложение, если разработчик сделал что-то не так. Полез в интернет из главного потока? Захотел прочитать файл? Получай исключение!

Мораль

Ни когда не выполняйте долгих операций в главном потоке!

Page 4: Android - 11 - Multithreading
Page 5: Android - 11 - Multithreading

Механизмы для асинхронного поведения● Thread/Executor т.е все что есть в Java.● Handler - позволяет работать с очередью сообщений,

ассоциированной с потоком.● AsyncTask - наверное, самый часто используемый компонент для

создания асинхронного поведения● Service/IntentService - не имеют ui, работают как фоновые процессы● Loader - еще один механизм для запуска асинхронных задач,

появился с API level 11

Page 6: Android - 11 - Multithreading

Handler

Page 7: Android - 11 - Multithreading

AsyncTask

Очень часто задача, предполагающая асинхронность выглядит так:

1. Сделать что то в UI потоке, например вывести диалог начала загрузки

2. Начать выполнять задачу в background поток, походу выполнения, может быть, что-то обновлять в UI потоке (например статус прогресса загрузки)

3. По завершению загрузки, что-то сделать в UI потоке, например вывести диалог о удачном завершении задачи.

Page 8: Android - 11 - Multithreading

AsyncTask

Page 9: Android - 11 - Multithreading

AsyncTask

Page 10: Android - 11 - Multithreading

AsyncTaskВ зависимости от версии android-а execute() для AsyncTask будет работать по разному:● 1.6 < API < 3.2 — на запуск новой AsyncTask будет выделяться новый

поток● API ≥ 3.2 — на запуск всех AsyncTask используется по умолчанию

один поток, но добавили поле AsyncTask.THREAD_POOL_EXECUTOR

Page 11: Android - 11 - Multithreading

Service

Page 12: Android - 11 - Multithreading

● Появились в API 11 (Android 3.0)● Привязаны к методам жизненного цикла activity или fragment-а● Крайне рекомендуется использовать только с cursor-ми (Cursor loader)

Loader

Основные компоненты

● LoaderManager - управляет Loader-ами (создает, уничтожает, стартует)

● LoaderManager.LoaderCallabacks - интерфейс для связи клиента и менеджера

● Loader - объект, асинхронно выполняющий задачу

Page 13: Android - 11 - Multithreading

Работа с сетью● Чаще всего под работой с сетью подразумевают взаимодействие с

REST-подобными сервисами т.е это HTTP + JSON/XML● Для доступа в сеть в вашем манифесте должен быть прописан

android.permission.INTERNET● Для отображения web-страниц в вашем приложении можно

использовать WebView - практически полноценный браузер

Стандартные средства● HttpClient● HttpUrlConnection ● OkHttp / Retrofit

Page 14: Android - 11 - Multithreading

Типичный use-case

• Создаем HttpClient (DefaultHttpClient или AndroidHttpClient)• Создаем и настраиваем запрос – объект класса HttpUriRequest (обычно HttpGet или HttpPost)• Выполняем запрос HttpClient.execute и получаем вответ HttpResponse• Разбираем HttpResponse – хедеры, строку ответа и т.д.• Получаем HttpEntity и разбираем тело ответа

HttpClient

Page 15: Android - 11 - Multithreading

HttpUrlConnection

Типичный use-case

• Создаем объект URL, зовем openConnection() и кастуемк HttpURLConnection• Подготавливаем запрос – устанавливаем хедеры,параметры запроса, тип контента и т.д.• По необходимости подготавливаем тело запроса (POSTзапрос). setDoOutput(true) и getOutputStream()• Читаем ответ сервера. Строку ответа (код, сообщение),хедеры, cookie и т.д.• Закрываем соединение и освобождаем все ресурсы

Page 16: Android - 11 - Multithreading

• Ребята из android команды утверждают, что и там и таместь куча багов

• В android 2.3+ багов меньше в HttpUrlConnection

• В предыдущих версиях – в HttpClient

• О каких именно багах идет речь – да кто бы знал

• С HttpClient’ом приятнее работать

HttpUrlConnection vs HttpClient

Page 17: Android - 11 - Multithreading

● OkHttp - библиотека для работы с http от компании Square.

● Retrofit - библиотека для работы с REST API от компании Square, на Android по умолчанию использует HttpUrlConnection, но лучше подключать OkHttp из-за ошибок в последнем.

OkHttp / Retrofit

Page 18: Android - 11 - Multithreading

Проблемы1. Асинхронность через callback-и очень скоро порождает высокую

степень вложенности (AsyncTask-а в AsyncTask-e), что резко снижает читабельность и сопровождаемость кода.

2. Кроме REST API, нам также постоянно приходится скачивать картинки и делать это приходится в adapter-ах к ListView.

3. Почти к любому backend-у необходимо выстраивать кэш на стороне приложения.

4. Часто результат выполнения сетевых запросов нужен не только в том месте, откуда они были вызваны

Решения1. Netflix/rxJava2. Square/picasso3. ??? (ORM*, сохранние json/xml в файлы, черт знает что еще)4. Square/Otto

Page 19: Android - 11 - Multithreading

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 API6. https://github.com/noveogroup/university-android-task6 - примеры по ходу

текущей лекции7. https://github.com/tttzof351/SmsReader - пример с loader-ом

Что еще почитать/посмотреть?

Page 20: Android - 11 - Multithreading

1. Реализовать экран StudentTaskActivity, показывающий список* заголовков новостей http://androidtraining.noveogroup.com/news/getAll

2. Пока новости загружаются, пользователю должен быть показан ProgressDialog

3. Использовать AsyncTask или Service для реализации асинхронного поведения

4. Формат ответов можно посмотреть http://androidtraining.noveogroup.com/main/requestFormat

* Можно так же показывать в элементах списка картинки, используя square/picasso

Задание