Узнаем про рекурсии. Глава интересная и простая. Склоняюсь к тому, что если хочется узнать основы алгоритмов, то книга прям идеальная для этого — https://zen.yandex.ru/media/android_junior/grokaem-algoritmy-rekursiia-chast-5-61ad2b2f15d3ca78802bc9b3
Дзен | Статьи
Грокаем алгоритмы. Рекурсия. Часть 5
Статья автора «Блог Android-разработчицы» в Дзене ✍: Заметки: Стек: Интересный факт, что каждый раз создается своя копия для number. Обратиться к number из другого метода нельзя.
https://zen.yandex.ru/media/android_junior/grokaem-algoritmy-esce-nemnogo-rekursii-chast-6-61ae3e31609d143097dece0a?& — и ещё про рекурсию
Дзен | Статьи
Грокаем алгоритмы. Ещё немного рекурсии. Часть 6.
Статья автора «Блог Android-разработчицы» в Дзене ✍: Заметки: Немного задач с примерами рекурсии: https://github.com/Ladgertha/Algorithms/blob/master/src/main/java/Recursive.kt
Вчера был доклад на вечную тему «Как сделать, чтобы проект собирался быстрее», но с интересным посылом «Как (не) ускорить сборку Android-проекта». Видео по ссылке: https://youtu.be/9YGScnDosN8?t=7063. Не сказать, чтобы я узнала что-то новое, но в целом докладчик хорошо рассказывает. А ещё он против модуля buildSrc, который я очень люблю. И он не упомянул, что в 7 gradle были большие доработки, так что с buildSrc не всё так плохо.
Кстати, я удивилась, когда докладчик сказал, что nonTransitiveRClass особо не ускоряет. Я читала, что он увеличивает скорость чуть ли не на 20%. Это было прям открытие для меня. Интересно всё-таки будет проверить на большом проекте, но для этого нужно, чтобы на этом большом проекте был седьмой gradle.
P.S. само видео почти на 2,5 часа, но имеет смысл смотреть только последний доклад. Остальное было про iOS.
Кстати, я удивилась, когда докладчик сказал, что nonTransitiveRClass особо не ускоряет. Я читала, что он увеличивает скорость чуть ли не на 20%. Это было прям открытие для меня. Интересно всё-таки будет проверить на большом проекте, но для этого нужно, чтобы на этом большом проекте был седьмой gradle.
P.S. само видео почти на 2,5 часа, но имеет смысл смотреть только последний доклад. Остальное было про iOS.
YouTube
Sber Mobile Meetup // 7.12.2021
Ближайшая конференция: Mobius 2025 Spring, 9–10 апреля, Москва + онлайн. Подробности и билеты: https://jrg.su/ojGU3B
— — Sber Mobile Meetup — это бесплатный онлайн-митап для мобильных разработчиков.
Доклады в программе:
– Андрей Попов — «Современный подход…
— — Sber Mobile Meetup — это бесплатный онлайн-митап для мобильных разработчиков.
Доклады в программе:
– Андрей Попов — «Современный подход…
Немного про быструю сортировку — https://zen.yandex.ru/media/android_junior/grokaem-algoritmy-bystraia-sortirovka-chast-7-61c8d65478414f16c628ae96?&
Дзен | Статьи
Грокаем алгоритмы. Быстрая сортировка. Часть 7
Статья автора «Блог Android-разработчицы» в Дзене ✍: Заметки: Эта сортировка намного быстрее сортировки выбором (когда делим пополам всегда).
https://zen.yandex.ru/media/android_junior/grokaem-algoritmy-heshtablicy-chast-8-61e86d813f62d6513a436350?& — хорошая глава про хеш-таблицы. Прочитала уже больше половины книги и пока что она мне очень нравится. Легкая и интересная — что еще нужно новичкам :)
Дзен | Статьи
Грокаем алгоритмы. Хеш-таблицы. Часть 8.
Статья автора «Блог Android-разработчицы» в Дзене ✍: Заметки: Теперь самое интересное. Время: Напомню, что О(1) — не моментальное время, а одинаковое всегда.
https://www.youtube.com/watch?v=qdTYqdMkIRg — небольшой митап, который сейчас начинается. Будет про WorkManager и миграцию на viewBinding
YouTube
GDG Minsk Mobile January Meetup
Subscribe to GDG Minsk:
Slides - https://shorturl.at/hsyHV
Feedback - https://forms.gle/x3RMjFe6d3SChK9j9
Telegram - https://t.me/gdgminsk
Facebook - https://www.facebook.com/groups/gdgminsk
Twitter - https://twitter.com/gdgminsk
✅ Анна Жаркова
Компания…
Slides - https://shorturl.at/hsyHV
Feedback - https://forms.gle/x3RMjFe6d3SChK9j9
Telegram - https://t.me/gdgminsk
Facebook - https://www.facebook.com/groups/gdgminsk
Twitter - https://twitter.com/gdgminsk
✅ Анна Жаркова
Компания…
Дошли до сложностей. Заметки по графам — https://zen.yandex.ru/media/android_junior/grokaem-algoritmy-grafy-i-poisk-v-shirinu-chast-9-61eda952bdda022848cc53e1
Дзен | Статьи
Грокаем алгоритмы. Графы и поиск в ширину. Часть 9
Статья автора «Блог Android-разработчицы» в Дзене ✍: Заметки: Как написать алгоритм с графами: 1) Создаем очередь с проверяемыми (двусторонняя) элементами.
https://zen.yandex.ru/media/android_junior/vajnost-softskillov-6202da52ffaa8e5ec1fc1caa — немного про софт-скиллы
Дзен | Статьи
Важность софт-скиллов
Статья автора «Блог Android-разработчицы» в Дзене ✍: В последнее время увлеклась темой софт-скиллов и смотрю кучу докладов. И вот что я поняла: на самом деле у меня всё плохо с ними.
Иногда нет сил что-то писать, но в то же время хочется. Так что просто легкая информация. :) https://zen.yandex.ru/media/android_junior/dinamicheskoe-obiavlenie-zavisimostei-6224d6c27a218f1d5ea5fe19
Дзен | Статьи
Динамическое объявление зависимостей
Статья автора «Блог Android-разработчицы» в Дзене ✍: Динамическое объявление — это когда мы пишем implementation("androidx.core:core-ktx:1.+").
Начинаем разбирать основные вопросы с собеседований и как бы я отвечала на них. Тут уже не совсем джуниорский уровень, но старалась отвечать максимально просто — https://zen.yandex.ru/media/android_junior/osnovnye-komponenty-androida-sobesedovanie-622de3788b35bd231d6dbaa4
Дзен | Блогерская платформа
Основные компоненты андроида. Собеседование.
Статья автора «Блог Android-разработчицы» в Дзене ✍: Решила я походить по собеседованиям и оценить свои знания и стоимость на рынке. Но сначала было бы неплохо подготовиться.
❤1
А точно каждый компонент должен быть зарегистрирован в манифесте?
Нет, не точно. Broadcast Receiver можно зарегистрировать двумя способами: статически в манифесте или динамически в коде.
Стоит заметить, что начиная с Android 8 большинство неявных бродкастов нельзя регистрировать в манифесте. Неявный бродкаст, это когда сообщение отправляется вообще всем приложениям, которые подходят, а не только нашему. Почему нельзя? В Android 8 были большие доработки по оптимизации. Представьте, что куча приложений подписаны на какое-то системное событие. Каждый бродкаст в этом случае потребляет ресурсы каждый раз при получении сообщения. В следствии этого активно тратится батарея, пользователь грустит и удаляет приложение.
Но все еще можем регистрировать в коде.
Список всех интентов, для которых неявный бродкаст можно в манифесте регистрировать — https://developer.android.com/guide/components/broadc...
Из тех, которые я помню:
ACTION_BOOT_COMPLETED — отправляется один раз при загрузке. Необходим для многих приложений, чтобы они все проинициализировались, запланировали что им надо и прочее.
ACTION_TIMEZONE_CHANGED и похожие — чтобы приложении могли свои настройки поправить (например, будильники).
ACTION_CONNECTION_STATE_CHANGED — чтобы приложения знали про соединение.
Еще есть всякие флаги, связанные со звонками, сообщениями, сетью и сменой/удаления пользователя.
Google рекомендует использовать JobSheduler вместо неявных бродкастов.
Какие вопросы можно задать из этого ответа?
— А какие еще ограничения есть?
— Что за JobSheduler и почему его?
Нет, не точно. Broadcast Receiver можно зарегистрировать двумя способами: статически в манифесте или динамически в коде.
Стоит заметить, что начиная с Android 8 большинство неявных бродкастов нельзя регистрировать в манифесте. Неявный бродкаст, это когда сообщение отправляется вообще всем приложениям, которые подходят, а не только нашему. Почему нельзя? В Android 8 были большие доработки по оптимизации. Представьте, что куча приложений подписаны на какое-то системное событие. Каждый бродкаст в этом случае потребляет ресурсы каждый раз при получении сообщения. В следствии этого активно тратится батарея, пользователь грустит и удаляет приложение.
Но все еще можем регистрировать в коде.
Список всех интентов, для которых неявный бродкаст можно в манифесте регистрировать — https://developer.android.com/guide/components/broadc...
Из тех, которые я помню:
ACTION_BOOT_COMPLETED — отправляется один раз при загрузке. Необходим для многих приложений, чтобы они все проинициализировались, запланировали что им надо и прочее.
ACTION_TIMEZONE_CHANGED и похожие — чтобы приложении могли свои настройки поправить (например, будильники).
ACTION_CONNECTION_STATE_CHANGED — чтобы приложения знали про соединение.
Еще есть всякие флаги, связанные со звонками, сообщениями, сетью и сменой/удаления пользователя.
Google рекомендует использовать JobSheduler вместо неявных бродкастов.
Какие вопросы можно задать из этого ответа?
— А какие еще ограничения есть?
— Что за JobSheduler и почему его?
👍1
Почему setContentView() надо обязательно указывать в onCreate() в активити? Почему не в onResume или в onViewCreated?
Тут надо вспомнить жизненный цикл активити. Ответ кроется в том, что onCreate у активити вызывается только один раз. Именно в этом методе мы делаем большинство инициализаций.
setContentView() — метод, который позволяет разместить пользовательский интерфейс на экране. И это достаточно тяжелая операция, особенно учитывая, что может быть очень сложная иерархия. Её нужно делать один раз. Если делать каждый раз в onResume, то, например, просто посмотрев уведомление в шторке, операция будет выполняться снова, что ухудшает производительность, приложение может подвиснуть, пользователь расстроится и напишет гневный отзыв.
Вопросы, которые можно задать?
— Какие параметры можно передать в setContentView?
— Какой жизненный цикл у активити?
— А есть еще какие-то методы, которые вызываются только один раз?
— Как работает onCreate?
Тут надо вспомнить жизненный цикл активити. Ответ кроется в том, что onCreate у активити вызывается только один раз. Именно в этом методе мы делаем большинство инициализаций.
setContentView() — метод, который позволяет разместить пользовательский интерфейс на экране. И это достаточно тяжелая операция, особенно учитывая, что может быть очень сложная иерархия. Её нужно делать один раз. Если делать каждый раз в onResume, то, например, просто посмотрев уведомление в шторке, операция будет выполняться снова, что ухудшает производительность, приложение может подвиснуть, пользователь расстроится и напишет гневный отзыв.
Вопросы, которые можно задать?
— Какие параметры можно передать в setContentView?
— Какой жизненный цикл у активити?
— А есть еще какие-то методы, которые вызываются только один раз?
— Как работает onCreate?
Продолжаем готовиться — https://zen.yandex.ru/media/android_junior/rasskaji-pro-aktiviti-i-ee-jiznennyi-cikl-6230de8248635521ad6b7d58?&
Дзен | Статьи
Расскажи про активити и её жизненный цикл.
Статья автора «Блог Android-разработчицы» в Дзене ✍: Activity — по сути, это экран, который видит пользователь.
👍2
— Что будет, если мы вызовем finish() в одном из колбэков жизненного цикла, а чуть дальше напишем что-то еще?
Выполнится весь метод и только потом произойдет завершение. Почему так?
Все методы жизненного цикла всегда обрабатываются в главном потоке в порядке очереди. И вот если мы вызовем finish() в одном из методов жизненного цикла, то в эту очередь добавится сообщение, но оно не будет выполнено, пока не вернется выполняемый callback, т.е. пока главный поток не освободится от текущей задачи.
— Когда в activity вызывается finish(), какие методы жизненного цикла вызываются?
onPause — onStop — onDestroy. Тут важно, что метод onSaveInstanceState не вызывается, потому что активити полностью уничтожается.
Выполнится весь метод и только потом произойдет завершение. Почему так?
Все методы жизненного цикла всегда обрабатываются в главном потоке в порядке очереди. И вот если мы вызовем finish() в одном из методов жизненного цикла, то в эту очередь добавится сообщение, но оно не будет выполнено, пока не вернется выполняемый callback, т.е. пока главный поток не освободится от текущей задачи.
— Когда в activity вызывается finish(), какие методы жизненного цикла вызываются?
onPause — onStop — onDestroy. Тут важно, что метод onSaveInstanceState не вызывается, потому что активити полностью уничтожается.
Немного про исключения — https://zen.yandex.ru/media/android_junior/rasskaji-chto-ty-znaesh-pro-iskliucheniia-sobesedovanie-6232399b1eaba10787ccd1d3
Дзен | Статьи
Расскажи, что ты знаешь про исключения. Собеседование.
Статья автора «Блог Android-разработчицы» в Дзене ✍: Если честно, я не думаю, что меня такое спросят. Но хочется разобрать что-то легкое, так что просто вспомним исключения.
Какая разница между val и var?
Такое точно не спросят, но просто повторим для общего образования.
var — изменяемое значение. Переменная может изменить свое значение с одного на другое. Это аналогично тому как мы в Java объявляем переменные.
val — переменная, которая разрешает чтение, но запрещает запись. Из этого следует, что val должна быть проинициализирована сразу, потому что она не может меняться после создания.
Такое точно не спросят, но просто повторим для общего образования.
var — изменяемое значение. Переменная может изменить свое значение с одного на другое. Это аналогично тому как мы в Java объявляем переменные.
val — переменная, которая разрешает чтение, но запрещает запись. Из этого следует, что val должна быть проинициализирована сразу, потому что она не может меняться после создания.
Разница между const и val
Оба слова используются для объявления неизменяемой переменной. Так в чем же разница?
const используется для объявления тех свойств, которые являются неизменяемыми по своей природе, т.е. они должны определяться во время компилирования. Во время выполнения константу нельзя объявить и проинициализировать.
Для констант есть несколько требований:
— Должна быть на уровне top-level или членом object или companion object
— Это должна быть строка или примитивный тип;
— Без кастомных геттеров.
Из этого следует, что мы не можем сделать константой какую-то функцию или класс, потому что они инициализируются в рантайме.
val мы можем инициализировать в рантайме. Например, можно в коде написать что-то в стиле valCatName = getCatName() и оно будет работать.
Зачем использовать const, если можно всегда использовать val? Когда мы используем константу, то она создается во время компиляции и не будет никаких дополнительных расходов во время выполнения.
Оба слова используются для объявления неизменяемой переменной. Так в чем же разница?
const используется для объявления тех свойств, которые являются неизменяемыми по своей природе, т.е. они должны определяться во время компилирования. Во время выполнения константу нельзя объявить и проинициализировать.
Для констант есть несколько требований:
— Должна быть на уровне top-level или членом object или companion object
— Это должна быть строка или примитивный тип;
— Без кастомных геттеров.
Из этого следует, что мы не можем сделать константой какую-то функцию или класс, потому что они инициализируются в рантайме.
val мы можем инициализировать в рантайме. Например, можно в коде написать что-то в стиле valCatName = getCatName() и оно будет работать.
Зачем использовать const, если можно всегда использовать val? Когда мы используем константу, то она создается во время компиляции и не будет никаких дополнительных расходов во время выполнения.
Когда не вызывается onPause и onStop?
Если в onCreate будет finish(). Аналогично, если finish() будет в onStart(), то вызовутся все методы, начиная с парного, т.е. с onStop.
Если finish() поставим в onResume(), то вызовутся все методы, начиная с onPause.
Может ли так быть, что не вызовется onDestroy?
Такое действительно может быть, поэтому не стоит использовать этот метод для сохранения данных. Бывают ситуации, когда система может убить процесс, которому принадлежит активити, не вызывая этот метод.
Ну и вспомнила еще один похожий вопрос. Может ли быть, что не вызовется finally?
Да, и таких вариантов на самом деле много:
— Вызываем System.exit(0) в блоке try;
— У JVM закончилась память;
— Наш джава-процесс убит;
— Дедлок в блоке try;
— Когда наше устройство выключается (например, из-за зарядки).
Если в onCreate будет finish(). Аналогично, если finish() будет в onStart(), то вызовутся все методы, начиная с парного, т.е. с onStop.
Если finish() поставим в onResume(), то вызовутся все методы, начиная с onPause.
Может ли так быть, что не вызовется onDestroy?
Такое действительно может быть, поэтому не стоит использовать этот метод для сохранения данных. Бывают ситуации, когда система может убить процесс, которому принадлежит активити, не вызывая этот метод.
Ну и вспомнила еще один похожий вопрос. Может ли быть, что не вызовется finally?
Да, и таких вариантов на самом деле много:
— Вызываем System.exit(0) в блоке try;
— У JVM закончилась память;
— Наш джава-процесс убит;
— Дедлок в блоке try;
— Когда наше устройство выключается (например, из-за зарядки).
https://zen.yandex.ru/media/android_junior/content-provider-chto-eto-623623a623af6b76efa08cd8 — утро начинается с Content Provider :)
Дзен | Статьи
Content Provider. Что это?
Статья автора «Блог Android-разработчицы» в Дзене ✍: Мы знаем, что каждое приложение живет в отдельном процессе. Но иногда так бывает, что мы хотим получить доступ к данным из другого приложения.