Клиент-серверные приложения

Содержание

Слайд 2

Введение в курс

Введение в курс

Слайд 3

Цели курса Изучить вопросы и проблемы, связанные с разработкой клиент-серверных приложений

Цели курса

Изучить вопросы и проблемы, связанные с разработкой клиент-серверных приложений
Изучить наиболее

действенные и популярные методы построения архитектуры приложений, а также научиться применять их на практике
Слайд 4

Формат курса Занятие – 2-2,5 часа Лекция – 60-80 минут Практика

Формат курса

Занятие – 2-2,5 часа
Лекция – 60-80 минут
Практика – 40-60 минут
Дополнительная

лекция – 15-20 минут
Командная работа над финальным проектом
Слайд 5

Рассматриваемые темы Обработка смены конфигурации в Activity Классические паттерны A/B/C для

Рассматриваемые темы

Обработка смены конфигурации в Activity
Классические паттерны A/B/C для обеспечения клиент-серверного

взаимодействия
Фреймворк RxJava и его применение в Android-разработке
Принципы Clean Architecture и их применение в построении архитектуры приложений
Слайд 6

Рассматриваемые темы Паттерн MVP Unit-тестирование Android-приложений UI-тестирование Android-приложений Фреймворк DataBinding и его использование в паттерне MVVM

Рассматриваемые темы

Паттерн MVP
Unit-тестирование Android-приложений
UI-тестирование Android-приложений
Фреймворк DataBinding и его

использование в паттерне MVVM
Слайд 7

Дополнительные темы Проблема Backpressure в RxJava и способы ее решения Библиотека

Дополнительные темы

Проблема Backpressure в RxJava и способы ее решения
Библиотека Google Agera

для построения архитектуры приложений
Библиотека Mosby для построения архитектуры приложений
Методология TDD (test-driven development)
Dagger 2 как библиотека для реализации принципа Dependency Injection
Слайд 8

Командный проект После 5-ого занятия Команды по 3 человека Выбор идеи

Командный проект

После 5-ого занятия
Команды по 3 человека
Выбор идеи проекта https://github.com/toddmotto/public-apis
Планирование

задач по проекту
Реализация проекта в команде, работа в Github
Слайд 9

Введение в архитектуру клиент-серверных приложений

Введение в архитектуру клиент-серверных приложений

Слайд 10

Зачем? От создателей “и так сойдет”

Зачем?

От создателей “и так сойдет”

Слайд 11

2007 2008

2007 2008

Слайд 12

Так все же почему? Крайне тяжело поддерживать Невозможно писать Unit-тесты

Так все же почему?

Крайне тяжело поддерживать
Невозможно писать Unit-тесты

Слайд 13

MVC как AAA (Activity, Activity, Activity)

MVC как AAA (Activity, Activity, Activity)

Слайд 14

2014 - пора улучшить ситуацию Концепция Material Design на конференции Google I/O

2014 - пора улучшить ситуацию

Концепция Material Design на конференции Google I/O

Слайд 15

Fernando Cejas 2) Architecting Android...The clean way? http://fernandocejas.com/2014/09/03/architecting-android-the-clean-way/

Fernando Cejas

2) Architecting Android...The clean way?
http://fernandocejas.com/2014/09/03/architecting-android-the-clean-way/

Слайд 16

Хорошая архитектура Поддерживаемая, удобная, расширяемая и много других красивых прилагательных Позволяет написание тестов

Хорошая архитектура

Поддерживаемая, удобная, расширяемая и много других красивых прилагательных
Позволяет написание тестов

Слайд 17

Много красивых прилагательных Модульность Четкое именование Короткие функции и классы WTF / min -> 0

Много красивых прилагательных

Модульность
Четкое именование
Короткие функции и классы
WTF / min ->

0
Слайд 18

Тестирование Unit-тесты для бизнес-логики Минимум зависимостей от Android-классов в тестируемых модулях + Интеграционные тесты

Тестирование

Unit-тесты для бизнес-логики
Минимум зависимостей от Android-классов в тестируемых модулях
+ Интеграционные тесты

Слайд 19

Основные задачи при разработке клиент-серверных приложений

Основные задачи при разработке клиент-серверных приложений

Слайд 20

Клиент-серверные приложения Организация клиент-серверного взаимодействия Обеспечение возможности тестирования классов, содержащих бизнес-логику

Клиент-серверные приложения

Организация клиент-серверного взаимодействия
Обеспечение возможности тестирования классов, содержащих бизнес-логику приложения

Это и

есть основные задачи, которые мы будем изучать в ходе курса
Слайд 21

Клиент-серверное взаимодействие Обработка ошибок Управление множеством запросов Корректное управление закрытием приложения

Клиент-серверное взаимодействие

Обработка ошибок
Управление множеством запросов
Корректное управление закрытием приложения

Слайд 22

Обеспечение возможности тестирования Модульность классов Минимальное число зависимостей от классов Android Dependency Injection

Обеспечение возможности тестирования

Модульность классов
Минимальное число зависимостей от классов Android
Dependency Injection

Слайд 23

Обработка смены конфигурации

Обработка смены конфигурации

Слайд 24

Проблемы Все поля в Activity уничтожаются при пересоздании Activity – нужно

Проблемы

Все поля в Activity уничтожаются при пересоздании Activity – нужно уметь

восстанавливать их
Нельзя повторно выполнять запросы и другие “тяжелые” задачи
Слайд 25

Запрет на смену ориентации Поддержка только одной ориентации в приложении часто

Запрет на смену ориентации

Поддержка только одной ориентации в приложении часто сказывается

не лучшим образом на UX
Не покрывает всех ситуаций, при которых Activity пересоздается
Слайд 26

Ручная обработка смены конфигурации

Ручная обработка смены конфигурации

Слайд 27

Ручная обработка смены конфигурации Система автоматически не меняет ресурсы (например, языковые

Ручная обработка смены конфигурации

Система автоматически не меняет ресурсы (например, языковые ресурсы

или ресурсы, зависящие от ориентации устройства)
Слайд 28

Сохранение состояния в Bundle

Сохранение состояния в Bundle

Слайд 29

Сохранение состояния в Bundle

Сохранение состояния в Bundle

Слайд 30

Сохранение состояния в Bundle Нельзя сохранять большие данные Вносит дополнительную непростую логику

Сохранение состояния в Bundle

Нельзя сохранять большие данные
Вносит дополнительную непростую логику

Слайд 31

Retain Fragment

Retain Fragment

Слайд 32

Retain Fragment

Retain Fragment

Слайд 33

Retain Fragment

Retain Fragment

Слайд 34

Retain Fragment Нужна аккуратность в использовании ссылок на Activity / Context При закрытии приложения уничтожается

Retain Fragment

Нужна аккуратность в использовании ссылок на Activity / Context
При закрытии

приложения уничтожается
Слайд 35

Loader Класс для загрузки данных Переживает пересоздание Activity Управляется специальным классом LoaderManager

Loader

Класс для загрузки данных
Переживает пересоздание Activity
Управляется специальным классом LoaderManager

Слайд 36

Loader

Loader

Слайд 37

LoaderManager public abstract Loader initLoader(int id, Bundle args, LoaderManager.LoaderCallbacks callback); public

LoaderManager

public abstract Loader initLoader(int id, Bundle args, LoaderManager.LoaderCallbacks callback);
public abstract

Loader restartLoader(int id, Bundle args, LoaderManager.LoaderCallbacks callback);
Слайд 38

LoaderManager.LoaderCallbacks public interface LoaderCallbacks { public Loader onCreateLoader(int id, Bundle args);

LoaderManager.LoaderCallbacks

public interface LoaderCallbacks {
public Loader onCreateLoader(int id, Bundle args);
public

void onLoadFinished(Loader loader, D data);
public void onLoaderReset(Loader loader);
}
Слайд 39

LoaderManager.LoaderCallbacks

LoaderManager.LoaderCallbacks

Слайд 40

Запускаем работу лоадера

Запускаем работу лоадера

Слайд 41

LoaderManager public abstract Loader initLoader(int id, Bundle args, LoaderManager.LoaderCallbacks callback); public

LoaderManager

public abstract Loader initLoader(int id, Bundle args, LoaderManager.LoaderCallbacks callback);
public abstract

Loader restartLoader(int id, Bundle args, LoaderManager.LoaderCallbacks callback);
Слайд 42

Загружаем данные в лоадере

Загружаем данные в лоадере

Слайд 43

Loader

Loader

Слайд 44

Loader protected void onStartLoading() { } protected void onForceLoad() { } protected void onStopLoading() { }

Loader

protected void onStartLoading() {
}
protected void onForceLoad() {
}
protected void onStopLoading() {
}

Слайд 45

Создаем свой лоадер

Создаем свой лоадер

Слайд 46

Создаем свой лоадер

Создаем свой лоадер

Слайд 47

Загружаем данные

Загружаем данные

Слайд 48

Создаем свой лоадер

Создаем свой лоадер

Слайд 49

Loader При закрытии приложения уничтожается Неудобно обрабатывать ошибки Много кода Больше примеров в статье

Loader

При закрытии приложения уничтожается
Неудобно обрабатывать ошибки
Много кода

Больше примеров в статье

Слайд 50

Практика

Практика

Слайд 51

Погода в нескольких городах Проект LoaderWeather. Описание задачи в файле ru.gdgkazan.simpleweather.screen.weatherlist.WeatherListActivity

Погода в нескольких городах

Проект LoaderWeather. Описание задачи в файле ru.gdgkazan.simpleweather.screen.weatherlist.WeatherListActivity
Нужно загрузить

погоду во всех городах при старте приложения
Сделать это наиболее быстрым способом (не каждый город последовательно)
Возможность обновления через SwipeRefreshLayout
Обработка пересоздания Activity