Лекция Android. БД SQLite, ContentProvider, LoaderАлександр БричЛекция по БД SQLite, ContentProvider, Loader в Android. Общее знакомство с классами и работой с БД.
Что нам стоит DAL построить? Акуляков Артём D2D Just.NETDev2DevРабота с данными - это ключевая функция большинства приложений. Но работать с данными не так просто как кажется. С одной стороны, нам нужна производительность, с другой все best practices диктуют нам принцип persistence ignorance, с третьей еще и хочется писать красивый и понятный код. Как найти баланс между всем этим? Чем хороший IRepository отличается от плохого? Что такое CQRS и причем тут функциональное программирование? Об этом и пойдет речь, а так же немного граблей и личного опыта.
Модульная структура. Цветцих Денис D2D Just.NETDev2DevСегодня многие фреймворки, такие как Prism или Autofac, позволяют разработчику организовать модульную структуру приложения. При этом часто бывает непонятно, для чего ещё нужны модули, кроме как для пресловутой "красоты архитектуры".
В рамках доклада я расскажу о том, какие существуют подходы к организации модульной структуры, в каких фреймворках они реализованы и для решения каких задач дает преимущество каждый подход.
ASP.NET MVC за пределами Hello World. Дятлов Александр D2D Just.NETDev2DevASP.NET MVC простой и распространённый инструмент. Но строить на его основе большое веб-приложение не так просто. Туториалы не раскрывают проблем возникающих при росте проекта. Зачастую, изначально стройная архитектура размазывается с каждой следующей итерацией.
Я хочу поделиться своим опытом. Рассказать об основных проблемах и предложить выбранные мной решения.
Moxy. Как правильно пользоваться? / Юрий Шмаков (Arello Mobile)OnticoРИТ++ 2017, AppsConf
Зал Касабланка, 6 июня, 16:00
Тезисы:
http://appsconf.ru/2017/abstracts/2704.html
В последнее время паттерн MVP будоражит Android-комьюнити. Уже есть несколько довольно приличных библиотек, которые помогают использовать этот подход. Но с ними вам придётся писать много boilerplate-кода. Поэтому я хочу познакомить вас с Moxy. Покажу, как использовать её компоненты для решения задач, которые будут вставать перед вами, когда вы решите использовать паттерн MVP. И расскажу, как устроены эти компоненты, и почему именно так, чтобы вы не боялись использовать Moxy из-за потенциальных подводных камней.
Что нам стоит DAL построить? Акуляков Артём D2D Just.NETDev2DevРабота с данными - это ключевая функция большинства приложений. Но работать с данными не так просто как кажется. С одной стороны, нам нужна производительность, с другой все best practices диктуют нам принцип persistence ignorance, с третьей еще и хочется писать красивый и понятный код. Как найти баланс между всем этим? Чем хороший IRepository отличается от плохого? Что такое CQRS и причем тут функциональное программирование? Об этом и пойдет речь, а так же немного граблей и личного опыта.
Модульная структура. Цветцих Денис D2D Just.NETDev2DevСегодня многие фреймворки, такие как Prism или Autofac, позволяют разработчику организовать модульную структуру приложения. При этом часто бывает непонятно, для чего ещё нужны модули, кроме как для пресловутой "красоты архитектуры".
В рамках доклада я расскажу о том, какие существуют подходы к организации модульной структуры, в каких фреймворках они реализованы и для решения каких задач дает преимущество каждый подход.
ASP.NET MVC за пределами Hello World. Дятлов Александр D2D Just.NETDev2DevASP.NET MVC простой и распространённый инструмент. Но строить на его основе большое веб-приложение не так просто. Туториалы не раскрывают проблем возникающих при росте проекта. Зачастую, изначально стройная архитектура размазывается с каждой следующей итерацией.
Я хочу поделиться своим опытом. Рассказать об основных проблемах и предложить выбранные мной решения.
Moxy. Как правильно пользоваться? / Юрий Шмаков (Arello Mobile)OnticoРИТ++ 2017, AppsConf
Зал Касабланка, 6 июня, 16:00
Тезисы:
http://appsconf.ru/2017/abstracts/2704.html
В последнее время паттерн MVP будоражит Android-комьюнити. Уже есть несколько довольно приличных библиотек, которые помогают использовать этот подход. Но с ними вам придётся писать много boilerplate-кода. Поэтому я хочу познакомить вас с Moxy. Покажу, как использовать её компоненты для решения задач, которые будут вставать перед вами, когда вы решите использовать паттерн MVP. И расскажу, как устроены эти компоненты, и почему именно так, чтобы вы не боялись использовать Moxy из-за потенциальных подводных камней.
Windbg: когда у нас не воспроизводится. Александр Головач ➠ CoreHard Autumn ...corehard_byНа практике возникают проблемы, которые невозможно воспроизвести и исследовать на стороне разработчика. В таких ситуациях порой бывает невозможно даже организовать удаленный доступ к машине. Во время доклада будут рассмотрены и даны советы по отладке типовых задач таких как аварийное завершение, утечка ресурсов и ошибки синхронизации в многопоточных приложениях. Мы будем использовать отладчик Windbg. Доклад будет интересен в первую очередь начинающим разработчикам, работающим с платформой Windows.
Масштабируемая архитектура фронтендаRoman DvornovКогда проект делает один разработчик — все просто. Когда над ним работает небольшая команда, можно синхронизироваться и договориться. А вот когда проектов (сайтов и приложений) становится много, и над ними трудится множество команд с перекрестной функциональностью и смежными зонами ответственности, все становится сложным и запутанным.
Я расскажу о своем виденье архитектуры фронтенда, какой она должна быть, чтобы обеспечить её масштабируемость. На основе своего опыта и проблем, с которыми сталкиваются большие проекты.
Видео: https://www.youtube.com/watch?list=PLknJ4Vr6efQFtZmsXmGG64Rz_PHrcXCBL&v=z9y6PNC2FL0
Владислав Грязнов "Многозадачность в PHP"FwdaysЭволюция проекта
Автоматизация бизнес-процессов
Очевидные решения
Продвинутые решения: Gearman, phpDaemon и другие
Очереди сообщений
Процессы в PHP - готовые решения (связки Очередь + Процессы)
Результаты удивляют
Проблемы и трудности, с которыми столкнулись
Мониторинг и отладка MySQL: максимум информации при минимальных потерях / Све...OnticoРИТ++ 2017, Backend Conf
Зал Сан-Паулу, 6 июня, 17:00
Тезисы:
http://backendconf.ru/2017/abstracts/2777.html
В сложной ситуации хорошо иметь под рукой детали: сообщения об ошибках, статистику времени выполнения запросов, данные о производительности операционной системы и железа. Много деталей! Современные версии MySQL позволяют собрать информацию практически обо всём. Однако любой включённый мониторинг имеет свою цену: производительность. Именно поэтому универсального решения "всё включено", подходящего для любого MySQL-приложения, не существует. Даже при использовании инструментов с графическим интерфейсом у вас всегда есть выбор: что отслеживать и что нет.
В докладе я хочу обсудить, какие опции должны быть включены всегда, какие опциональны и при каких обстоятельствах их включать. Мы рассмотрим встроенные возможности MySQL, Percona-серверов и внешние решения.
3. Возможные варианты
●
Shared preferences (настройки)
–
●
Сохранение пар ключ-значений для примитивных типов
Внутренняя память
–
19:58
Сохранение данных на внутренней памяти устройства
3 из 41
4. Возможные варианты
●
Shared preferences (настройки)
–
●
Внутренняя память
–
●
Сохранение пар ключ-значений для примитивных типов
Сохранение данных на внутренней памяти устройства
Внешняя память
–
19:58
Сохранение данных на внешней памяти устройства
4 из 41
5. Возможные варианты
●
Shared preferences (настройки)
–
●
Внутренняя память
–
●
Сохранение данных на внутренней памяти устройства
Внешняя память
–
●
Сохранение пар ключ-значений для примитивных типов
Сохранение данных на внешней памяти устройства
База данный SQLite
–
19:58
Сохранение структурированных данных в БД
5 из 41
7. Настройки (Shared preferences)
●
●
●
Класс SharedPreferences
Позволяет сохранять данные примитивных
типов: boolean, float, int, long и string.
Данные хранятся парами ключ-значение. Ключ
типа String.
19:58
7 из 41
8. Настройки (Shared preferences)
●
●
●
●
Класс SharedPreferences
Позволяет сохранять данные примитивных
типов: boolean, float, int, long и string.
Данные хранятся парами ключ-значение. Ключ
типа String.
Сохранение данных выполняется для всех
сессий пользователя, даже если приложение
будет убито.
19:58
8 из 41
9. Настройки (Shared preferences)
●
2 варианта загрузки настроек в приложение:
–
19:58
getSharedPreferences() - используется, если
необходимо несколько файлов настроек,
определяемых именем (первый параметр);
9 из 41
10. Настройки (Shared preferences)
●
2 варианта загрузки настроек в приложение:
–
getSharedPreferences() - используется, если
необходимо несколько файлов настроек,
определяемых именем (первый параметр);
–
getPreferences() - используется, если нужен только
один файл настроек. Имя не указывается.
19:58
10 из 41
12. Настройки (Shared preferences)
●
●
Для изменения настроек необходимо получить объект
SharedPreferences.Editor
Добавление значений производиться методами типа:
putBoolean(String key, boolean value);
putString(String key, String value);
19:58
12 из 41
13. Настройки (Shared preferences)
●
●
●
Для изменения настроек необходимо получить объект
SharedPreferences.Editor
Добавление значений производиться методами типа:
putBoolean(String key, boolean value);
putString(String key, String value);
Сохранение настроек производиться методом commit().
19:58
13 из 41
14. Настройки (Shared preferences)
●
●
●
●
Для изменения настроек необходимо получить объект
SharedPreferences.Editor
Добавление значений производиться методами типа:
putBoolean(String key, boolean value);
putString(String key, String value);
Сохранение настроек производиться методом commit().
Для чтения значений используются методы типа:
getBoolean(String key, boolean defValue);
getString(String key, String defValue);
19:58
14 из 41
15. Настройки (Shared preferences)
public class Calc extends Activity {
public static final String PREFS_NAME = "MyPrefsFile";
@Override
protected void onCreate(Bundle state) {
super.onCreate(state);
...
// Восстановление настроек
SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0);
boolean silent = settings.getBoolean("silentMode", false);
setSilent(silent);
}
@Override
protected void onStop() {
super.onStop();
// Получаем объект Editor для изменения настроек
SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0);
SharedPreferences.Editor editor = settings.edit();
editor.putBoolean("silentMode", mSilentMode);
// Сохранить изменения!
editor.commit();
}
}
19:58
15 из 41
18. Настройки (Shared preferences)
●
Особенности:
–
метод contains(String key) для проверки наличия настройки;
–
метод Map<String, ?> getAll() возвращает все настройки из
файла;
–
метод registerOnSharedPreferenceChangeListener()
позволяет зарегистрировать callback, реагирующий на
изменение настроек;
19:58
18 из 41
19. Настройки (Shared preferences)
●
Особенности:
–
метод contains(String key) для проверки наличия настройки;
–
метод Map<String, ?> getAll() возвращает все настройки из
файла;
–
метод registerOnSharedPreferenceChangeListener()
позволяет зарегистрировать callback, реагирующий на
изменение настроек;
–
метод clear() - удаляет все настройки из
SharedPreferences.Editor;
19:58
19 из 41
20. Настройки (Shared preferences)
●
Особенности:
–
метод contains(String key) для проверки наличия настройки;
–
метод Map<String, ?> getAll() возвращает все настройки из
файла;
–
метод registerOnSharedPreferenceChangeListener()
позволяет зарегистрировать callback, реагирующий на
изменение настроек;
–
метод clear() - удаляет все настройки из
SharedPreferences.Editor;
–
метод remove(String key) — помечает значение для
удаления, которое будет произведено после вызова
commit().
19:58
20 из 41
23. Внутренняя память приложения
●
●
●
По-умолчанию файлы во внутренней памяти недоступны
другим приложениям и пользователю.
Файлы удаляются вместе с приложением.
Для создания файла применяется метод
FileOutputStream openFileOutput(String name, int mode).
19:58
23 из 41
24. Внутренняя память приложения
●
●
●
●
По-умолчанию файлы во внутренней памяти недоступны
другим приложениям и пользователю.
Файлы удаляются вместе с приложением.
Для создания файла применяется метод
FileOutputStream openFileOutput(String name, int mode).
Для записи в файл — метод write().
19:58
24 из 41
25. Внутренняя память приложения
●
●
●
По-умолчанию файлы во внутренней памяти недоступны
другим приложениям и пользователю.
Файлы удаляются вместе с приложением.
Для создания файла применяется метод
FileOutputStream openFileOutput(String name, int mode).
●
Для записи в файл — метод write().
●
Для закрытия файла — метод close().
19:58
25 из 41
26. Внутренняя память приложения
●
●
●
По-умолчанию файлы во внутренней памяти недоступны
другим приложениям и пользователю.
Файлы удаляются вместе с приложением.
Для создания файла применяется метод
FileOutputStream openFileOutput(String name, int mode).
●
Для записи в файл — метод write().
●
Для закрытия файла — метод close().
●
Для открытия файла на чтение метод
FileInputStream openFileInput(String name).
19:58
26 из 41
27. Внутренняя память приложения
●
●
●
По-умолчанию файлы во внутренней памяти недоступны
другим приложениям и пользователю.
Файлы удаляются вместе с приложением.
Для создания файла применяется метод
FileOutputStream openFileOutput(String name, int mode).
●
Для записи в файл — метод write().
●
Для закрытия файла — метод close().
●
●
Для открытия файла на чтение метод
FileInputStream openFileInput(String name).
Для чтения из файла — метод read().
19:58
27 из 41
29. Внутренняя память приложения
●
Особенности:
–
для сохранения кэша рекомендуется использовать метод
getCacheDir();
–
метод getFilesDir() возвращает абсолютный путь к файлу
приложения;
19:58
29 из 41
30. Внутренняя память приложения
●
Особенности:
–
для сохранения кэша рекомендуется использовать метод
getCacheDir();
–
метод getFilesDir() возвращает абсолютный путь к файлу
приложения;
–
метод getDir() содаёт (или открывает существующий)
каталог во внутренней памяти;
19:58
30 из 41
31. Внутренняя память приложения
●
Особенности:
–
для сохранения кэша рекомендуется использовать метод
getCacheDir();
–
метод getFilesDir() возвращает абсолютный путь к файлу
приложения;
–
метод getDir() содаёт (или открывает существующий)
каталог во внутренней памяти;
–
метод deleteFile() удаляет существующий файл;
19:58
31 из 41
32. Внутренняя память приложения
●
Особенности:
–
для сохранения кэша рекомендуется использовать метод
getCacheDir();
–
метод getFilesDir() возвращает абсолютный путь к файлу
приложения;
–
метод getDir() содаёт (или открывает существующий)
каталог во внутренней памяти;
–
метод deleteFile() удаляет существующий файл;
–
метод fileList() возвращает массив имён файлов,
сохранённых во внутренней памяти.
19:58
32 из 41
34. Внешняя память
●
●
SD-карта памяти или встроенная память для хранения
информации.
Файлы доступны всем и могут быть изменены (или
удалены) пользователем.
19:58
34 из 41
35. Внешняя память
●
●
●
SD-карта памяти или встроенная память для хранения
информации.
Файлы доступны всем и могут быть изменены (или
удалены) пользователем.
Метод для проверки доступности внешней памяти:
getExternalStorageState()
19:58
35 из 41
36. Внешняя память
boolean mExternalStorageAvailable = false;
boolean mExternalStorageWriteable = false;
String state = Environment.getExternalStorageState();
if (Environment.MEDIA_MOUNTED.equals(state)) {
// Можно читать и записывать медиа файлы
mExternalStorageAvailable = mExternalStorageWriteable = true;
} else if (Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)) {
// Можно только читать медиа файлы
mExternalStorageAvailable = true;
mExternalStorageWriteable = false;
} else {
// Что-то произошло. Это может быть одно из множества состояний,
// но точно известно, что нет возможности ни записывать, ни читать файлы
mExternalStorageAvailable = mExternalStorageWriteable = false;
}
19:58
36 из 41
38. Внешняя память
●
●
Доступ к файлам через метод
File getExternalFilesDir(String type).
type — тип возвращаемой директории: DIRECTORY_MUSIC,
DIRECTORY_PODCASTS, DIRECTORY_RINGTONES,
DIRECTORY_ALARMS, DIRECTORY_NOTIFICATIONS,
DIRECTORY_PICTURES, DIRECTORY_MOVIES или null.
19:58
38 из 41
39. Внешняя память
●
●
●
Доступ к файлам через метод
File getExternalFilesDir(String type).
type — тип возвращаемой директории: DIRECTORY_MUSIC,
DIRECTORY_PODCASTS, DIRECTORY_RINGTONES,
DIRECTORY_ALARMS, DIRECTORY_NOTIFICATIONS,
DIRECTORY_PICTURES, DIRECTORY_MOVIES или null.
Метод предоставляет доступ к общедоступному каталогу
File getExternalStoragePublicDirectory(String type).
19:58
39 из 41
40. Внешняя память
●
●
●
●
Доступ к файлам через метод
File getExternalFilesDir(String type).
type — тип возвращаемой директории: DIRECTORY_MUSIC,
DIRECTORY_PODCASTS, DIRECTORY_RINGTONES,
DIRECTORY_ALARMS, DIRECTORY_NOTIFICATIONS,
DIRECTORY_PICTURES, DIRECTORY_MOVIES или null.
Метод предоставляет доступ к общедоступному каталогу
File getExternalStoragePublicDirectory(String type).
Доступ к каталогу хранения кэш файлов
File getExternalCacheDir()
19:58
40 из 41
41. Окно настроек
●
●
●
Базовый класс — PreferenceActivity
Начиная с API Level 11 рекомендуется использовать
PreferenceFragment
Основные стандартные настройки:
–
CheckBoxPreference
–
ListPreference
–
EditTextPreference
19:58
41 из 41