Upload
ontico
View
159
Download
3
Embed Size (px)
Citation preview
Как мы данные готовилиORM и все-все-все в приложение Почта Mail.Ru
Кирилл ФилимоновMail.Ru Group
Что должно уметь почтовое приложение?
Что должно уметь почтовое приложение?
● Написать письмо
Что должно уметь почтовое приложение?
● Написать письмо● Отправить письмо
Что должно уметь почтовое приложение?
● Написать письмо● Отправить письмо● Получить письмо
Что должно уметь почтовое приложение?
● Написать письмо● Отправить письмо● Получить письмо● Сохранить письмо
Что должно уметь почтовое приложение?
● Написать письмо● Отправить письмо● Получить письмо● Сохранить письмо
Что должно уметь почтовое приложение?
● Написать письмо● Отправить письмо● Получить письмо● Сохранить письмА
Domain Driven Slide
Domain Driven Slide● Письмо
Domain Driven Slide● Письмо● Папка
Domain Driven Slide● Письмо● Папка● Тред
Domain Driven Slide● Письмо● Папка● Тред● Аккаунт● Фильтры● Сессия● Вложения● Реклама● Конфигурация● ...
Domain Driven Slide
Domain Driven SlideThread
Presentation
Presentation
Presentation
Message
Message
Message
Domain Driven Slide
Domain Driven Slide
Domain Driven Slide
Следствия
● Действие пользователя может порождать множество операций над данными
● Операции над данными могут зависеть друг от друга● Операции могут занимать значительное время
Что важно для пользователя
Что важно для пользователя
● Отзывчивый UI
Что важно для пользователя
● Отзывчивый UI● Видеть результат операции, даже если она не успешна
Что важно для пользователя
● Отзывчивый UI● Видеть результат операции, даже если она не успешна● Скорость выполнения операции
Инструменты
● SQLite● ORMLite● Напильник
Off-UI инструменты● Thread
Off-UI инструменты● Thread● AsyncTask
Off-UI инструменты● Thread● AsyncTask● Loader
Off-UI инструменты● Thread● AsyncTask● Loader● AsyncQueryHandler
● обработка отмены задач
Что может пойти не так
● обработка отмены задач● orientation changes
Что может пойти не так
● обработка отмены задач● orientation changes● CursorAdapter
Что может пойти не так
● обработка отмены задач● orientation changes● CursorAdapter● нотификация об изменениях
Что может пойти не так
java.lang.IllegalStateException: The content of the adapter has changed but ListView did not receive a
notification. Make sure the content of your adapter is not modified from a background thread, but only from
the UI thread.
Что выбрали мы
Операция над данными● Асинхронная операция — шаблон Command● Операция над сущностями БД:
Группа операций● Шаблон Composer
Команда для Database пула
SQLite и ORMLite: транзакции● SQLite
SQLite и ORMLite: транзакции● SQLite● ORMLite
Реализация команды с транзакцией
● Entity — базовый класс сущности● ID - тип идентификатора● тело request() будет выполнено в рамках транзакции
Доступ к результам из UI“Ближе — проще”, unknown
Доступ к результам из UI“Ближе — проще”, unknown
● закэшированы в памяти
Доступ к результам из UI“Ближе — проще”, unknown
● закэшированы в памяти● доступны из UI
DAO cache && UI cache
DAO object cache flow
Операции, обновляющие кэш:● dao.create(...)● dao.query(...)● dao.delete(...)
DAO object cache flow
Операции, НЕ обновляющие кэш:● dao.update(...)● dao.update(PreparedUpdate)
DAO object cache flow
DAO object cache flowCustomDao поддерживает обновления в ObjectCache
Взаимодействие кэшей
● тип операции● класс сущности● объект
Кэш операция
Буферизация операций
Буферизация нотификаций
● EntityManager
Получение данных из кэша
● EntityManager● getFromCache(...)
Получение данных из кэша
● EntityManager● getFromCache(...)● loadMore(...)
Получение данных из кэша
● EntityManager● getFromCache(...)● loadMore(...)● refresh(...)
Получение данных из кэша
● построение поисковых индексов в фоне● индекс строится при изменении данных в объектном кэше● передача построенного индекса в UI поток● быстрый поиск в UI
Поиск
До:● результаты > 1 сек● progress bar на экране
После:● результаты ~20 мс● дополняются серверными результами
Поиск