Блог Android-разработчицы
849 subscribers
13 photos
179 links
ex-VK, ex-MTS, 6+ лет опыта. Team Lead

Заметки, интересные задачи с работы (в рамках NDA) и просто мои мысли.

Блог: https://dzen.ru/android_junior

Личный канал: https://t.me/android_junior_notes

Мой аккаунт: https://t.me/bagena
Download Telegram
Сегодня разберем немного простых вопросов.

Что ты знаешь про lateinit?

Это один из самых спорных инструментов. Его или любят и везде используют или опасаются и яростно оберегают проект от подобного.

Довольно часто бывает, что мы хотим объявить переменную, но проинициализировать её позже. Конечно, можно сделать private var cat: String? = null, но что если переменная не должна быть null?

Тут нам поможет слово lateinit. Оно позволяет объявить переменную, но проинициализировать её в другом месте. И вот тут самый большой подвох. Может случиться так, что мы попробуем получить значение до того, как присвоим его переменной. И тогда мы получим UninitializedPropertyAccessException. Поэтому, если не уверены, то лучше предварительно проверять через this::cat.isInitialized (выражение вернет true или false), а потом уже пытаться получить значение.

Я отношусь к тем людям, которые предпочитают не использовать lateinit. Мы не роботы и обязательно случится так, что мы где-то попробуем получить значение раньше или что-то случится и в итоге приложение упадет с исключением.

Кстати, тут еще можно добавить, что lateinit как раз используется в даггере при инжекте объекта. Но тогда стоит ожидать, что собеседующий дальше спросит про даггер и перейдет к этой теме.
Как запустить компонент андроида в другом процессе?

Тут нам поможет android:process="имя_процесса" в манифесте.

Обычно все компоненты приложения выполняют в процессе, созданным для приложения. Но бывают ситуации, когда нужно какой-то компонент вынести в другой процесс. За три года моей работы я встречала такое только один раз. Но встречала же, так что вполне реальная ситуация.

Если имя указанного процесса начинается с ':', то создается новый процесс. Если двоеточия нет, то будет выполняться в существующем процессе с таким именем. Так разные компоненты в разных приложениях могут использовать один процесса, тем самым сокращая потребление ресурсов.

Новый процесс — достаточно тяжелое действие, так что лучше его не использовать, если это не необходимо.
👍1
Вспоминаем основное про манифест.

Обычно про него задают довольно поверхностные вопросы, так что кратко пройдемся. Впрочем, много про него и не рассказать.

Манифест — то, что должно быть в каждом приложении. Там описывается основная информация о нашем приложении для ОС Андроид, Google Play и инструментов сборки.

В манифесте обязательно должны быть указаны:

— Компоненты, которые мы используем, и их имена. Если не укажем, то система не сможет стартовать компонент. Интент-фильтры, если используем.

— Необходимые разрешения, в которых приложение нуждается. А еще разрешения, которые другие приложения должны иметь, чтобы получить доступ к данным нашего приложения. Начиная с 6 андроида пользователь может отклонять какие-то разрешения в рантайме. Но мы все равно должны указать их в манифесте.

— Различные требования к девайсам, которые необходимы для корректной работы приложения. Например, минимальная версия системы.

Что можно спросить?
— Что за интент-фильтры?
— А что там с разрешениями? Какие знаешь и какие нужны?
👍1
Очень кратко про рефлексию.

Рефлексия — это специальное API, которое позволяет получить доступ к данным приложения во время выполнения.

С помощью рефлексии мы можем узнать кучу всего о классах, методах и т.п. А еще мы можем получить приватные поля и даже изменить их значения. И можем создавать экземпляры класса прямо во время выполнения.

Рефлексия работает через java.lang.Class. JVM создает его для каждого объекта и именно через него мы можем всё делать.

Почему не любят рефлексию? Чуть выше я писала, что так мы можем получать доступ к приватным полям и менять значения. И тут мы напрочь ломаем инкапсуляцию и архитектуру приложения. Плюс дополнительно из-за того что мы все делаем динамически, снижается производительность. Ну и код, написанный с помощью рефлексии, довольно сложный и запутанный.
https://www.educative.io/courses/grokking-the-behavioral-interview — закончила курс по подготовке к собеседованию. Он бесплатный, поэтому многого я не ожидала от него, но на самом деле довольно хороший. Не зря educative советуют для подготовки.

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

Из минусов: сертификат никак не купить. У меня не сработал ни один способ. Но тут уж сайт не виноват. 😔
Когда я начала смотреть WorkManager, то думала, что там всё достаточно просто. Это же обычная фоновая работа и что там вообще изучать-то. Оказалось, что там очень много всего. И это я ещё не дошла до дебага и общение с воркером 🤔
👍4