Слайд 3Цели курса
Изучить вопросы и проблемы, связанные с разработкой клиент-серверных приложений
Изучить наиболее действенные
и популярные методы построения архитектуры приложений, а также научиться применять их на практике
Слайд 4Формат курса
Занятие – 2-2,5 часа
Лекция – 60-80 минут
Практика – 40-60 минут
Дополнительная лекция
– 15-20 минут
Командная работа над финальным проектом
Слайд 5Рассматриваемые темы
Обработка смены конфигурации в Activity
Классические паттерны A/B/C для обеспечения клиент-серверного взаимодействия
Фреймворк
RxJava и его применение в Android-разработке
Принципы Clean Architecture и их применение в построении архитектуры приложений
Слайд 6Рассматриваемые темы
Паттерн MVP
Unit-тестирование Android-приложений
UI-тестирование Android-приложений
Фреймворк DataBinding и его использование
в паттерне MVVM
Слайд 7Дополнительные темы
Проблема Backpressure в RxJava и способы ее решения
Библиотека Google Agera для
построения архитектуры приложений
Библиотека Mosby для построения архитектуры приложений
Методология TDD (test-driven development)
Dagger 2 как библиотека для реализации принципа Dependency Injection
Слайд 8Командный проект
После 5-ого занятия
Команды по 3 человека
Выбор идеи проекта https://github.com/toddmotto/public-apis
Планирование задач
по проекту
Реализация проекта в команде, работа в Github
Слайд 9Введение в архитектуру клиент-серверных приложений
Слайд 10Зачем?
От создателей “и так сойдет”
Слайд 12Так все же почему?
Крайне тяжело поддерживать
Невозможно писать Unit-тесты
Слайд 13MVC как AAA (Activity, Activity, Activity)
Слайд 142014 - пора улучшить ситуацию
Концепция Material Design на конференции Google I/O
Слайд 15Fernando Cejas
2) Architecting Android...The clean way?
http://fernandocejas.com/2014/09/03/architecting-android-the-clean-way/
Слайд 16Хорошая архитектура
Поддерживаемая, удобная, расширяемая и много других красивых прилагательных
Позволяет написание тестов
Слайд 17Много красивых прилагательных
Модульность
Четкое именование
Короткие функции и классы
WTF / min -> 0
Слайд 18Тестирование
Unit-тесты для бизнес-логики
Минимум зависимостей от Android-классов в тестируемых модулях
+ Интеграционные тесты
Слайд 19Основные задачи при разработке клиент-серверных приложений
Слайд 20Клиент-серверные приложения
Организация клиент-серверного взаимодействия
Обеспечение возможности тестирования классов, содержащих бизнес-логику приложения
Это и есть
основные задачи, которые мы будем изучать в ходе курса
Слайд 21Клиент-серверное взаимодействие
Обработка ошибок
Управление множеством запросов
Корректное управление закрытием приложения
Слайд 22Обеспечение возможности тестирования
Модульность классов
Минимальное число зависимостей от классов Android
Dependency Injection
Слайд 24Проблемы
Все поля в Activity уничтожаются при пересоздании Activity – нужно уметь восстанавливать
их
Нельзя повторно выполнять запросы и другие “тяжелые” задачи
Слайд 25Запрет на смену ориентации
Поддержка только одной ориентации в приложении часто сказывается не
лучшим образом на UX
Не покрывает всех ситуаций, при которых Activity пересоздается
Слайд 26Ручная обработка смены конфигурации
Слайд 27Ручная обработка смены конфигурации
Система автоматически не меняет ресурсы (например, языковые ресурсы или
ресурсы, зависящие от ориентации устройства)
Слайд 30Сохранение состояния в Bundle
Нельзя сохранять большие данные
Вносит дополнительную непростую логику
Слайд 34Retain Fragment
Нужна аккуратность в использовании ссылок на Activity / Context
При закрытии приложения
уничтожается
Слайд 35Loader
Класс для загрузки данных
Переживает пересоздание Activity
Управляется специальным классом LoaderManager
Слайд 37LoaderManager
public abstract Loader initLoader(int id, Bundle args, LoaderManager.LoaderCallbacks callback);
public abstract
Loader restartLoader(int id, Bundle args, LoaderManager.LoaderCallbacks callback);
Слайд 38LoaderManager.LoaderCallbacks
public interface LoaderCallbacks {
public Loader onCreateLoader(int id, Bundle args);
public void
onLoadFinished(Loader loader, D data);
public void onLoaderReset(Loader loader);
}
Слайд 41LoaderManager
public abstract Loader initLoader(int id, Bundle args, LoaderManager.LoaderCallbacks callback);
public abstract
Loader restartLoader(int id, Bundle args, LoaderManager.LoaderCallbacks callback);
Слайд 44Loader
protected void onStartLoading() {
}
protected void onForceLoad() {
}
protected void onStopLoading() {
}
Слайд 49Loader
При закрытии приложения уничтожается
Неудобно обрабатывать ошибки
Много кода
Больше примеров в статье
Слайд 51Погода в нескольких городах
Проект LoaderWeather. Описание задачи в файле ru.gdgkazan.simpleweather.screen.weatherlist.WeatherListActivity
Нужно загрузить погоду
во всех городах при старте приложения
Сделать это наиболее быстрым способом (не каждый город последовательно)
Возможность обновления через SwipeRefreshLayout
Обработка пересоздания Activity