Android Live 🤖
5.51K subscribers
52 photos
784 links
Самые свежие новости, новинки и тренды Android от практикующего разработчика.


Автор: @al_gorshkov,
Чат: @android_live_chat
Личный блог: @al_gorshkov_blog

Рекламу не размещаю
Download Telegram
​​Разновидности commit()
#interview #intro

При использовании Fragment есть 4 способа совершить транзакцию: commit(), commitAllowingStateLoss(), commitNow(), commitNowAllowingStateLoss().

По логике, должно быть достаточно только первого метода, но на практике их 4.
Для чего нужны все эти методы и чем они отличаются?
Это распространённый вопрос на собеседованиях, да и при повседневном кодинге подобная информация может быть важной. Давайте рассмотрим подробнее.

🔸commit() vs commitAllowingStateLoss(). Иногда при использовании Fragment или DialogFragment можно столкнуться с ошибкой can’t perform a commit after onSaveInstanceState(). Детальная статья об этой ошибке тут, а главный недостаток этого бага в том, что его не так просто отловить при разработке и он легко может проявиться в проде.
commit() и commitAllowingStateLoss() почти одинаковы в своей работе за исключением одного: при вызове commit FragmentManager проверяет, сохранил ли он своё состояние или нет. Если сохранил, то появляется эта ошибка.
При вызове commitAllowingStateLoss() вы не получите ошибку, однако FragmentManager может потерять своё состояние, и, соответственно, других фрагментов, добавленных после метода onSaveInstanceState().

🔸commit() vs commitNow(). Другая альтернатива использования commit влияет на время выполнения транзакции.
При вызове commit() транзакция не совершается мгновенно: она планируется в главном потоке и выполняется только тогда, когда этот поток готов к выполнению. На практике это даёт возможность выполнять любое число транзакций, но следует помнить, что они не выполнятся сразу.
При вызове commitNow() транзакция выполняется в тот же момент: если вызвать несколько транзакций, то все другие будут ожидать, пока первая не завершит своё выполнение. Стоит знать, что документация предостерегает не использовать этот метод, если вам нужно добавлять фрагмент в back stack.

В итоге получаем такую картину: если нужно выполнять транзакции синхронно и без добавления в back stack, то стоит использовать commitNow(). Если же транзакций несколько и важно добавлять их в back stack, то commit(). При возникновении ошибки стоит постараться выяснить причину её появления, и если победить её не удаётся, то лучше использовать методы с префиксом AllowingStateLoss.

Почитать подробнее про использование методов можно в этой статье.
​​Про PendingIntent
#interview

PendingIntent — довольно важная часть приложений под Android, о которой мы часто забываем и не до конца понимаем, для чего она нужна. Так как с Android 12 у нас добавились изменения, связанные с работой с PendingIntent, давайте посмотрим, что это за класс, ну и поговорим про изменения.

PendingIntent по сути — обёртка над обычным Intent, которая позволяет другому приложению выполнить какое-то действие в будущем от имени вашего приложения.

Отсюда мы сразу выносим две ключевые разницы:
🔹событие связано с будущим действием;
🔹это действие происходит от имени вашего приложения.

Область применения PendingIntent довольно обширна. Самые распространённые кейсы — это работа с AlarmManager и уведомлениями. Тут можно найти ещё пару кейсов, например при взаимодействии с получением результата от другого приложения.

PendingIntent создаётся с флагами, которые влияют на его работу.

🔸FLAG_IMMUTABLE — означает, что Intent внутри PendingIntent не может быть модифицирован другим приложением. Важно помнить, что приложение всегда может менять свои PendingIntent, даже если они неизменяемы для других приложений. До Android 12 все PendingIntent, созданные без этого флага были изменяемыми по умолчанию.

🔸FLAG_MUTABLE — означает, что компонент внутри PendingIntent может быть модифицирован другим приложением при помощи PendingIntent.send(). Флаг был добавлен в Android 12, и очень важно заполнять ComponentName при такой модификации.

🔸FLAG_UPDATE_CURRENT — означает, что необходимо обновить содержимое компонента без создания нового PendingIntent. Если такого нет, то будет создан новый.

🔸FLAG_ONE_SHOT — позволяет PendingIntent выполнять действие только один раз.

🔸FLAG_CANCEL_CURRENT — закрывает существующий PendingIntent, что особенно важно, если вы хотите поменять приложение, на которое завязан ваш текущий PendingIntent.

Почитать детальнее о том, как использовать этот компонент в Android 12 можно тут.
​​System Design Interview
#interview

Отличная статья, которая будет интересна тем, кто подготавливается к собеседованиям в компании, где одним из шагов является — System Design Interview. По сути, вас просят описать, как разработать какой-то сервис (например приложение Twitter).

Решение не должно быть идеальным: никто не ожидает, что вы сможете сделать совершенную систему за полчаса. Важна коммуникация с интервьюером и те мысли, уточняющие вопросы, которые вы задаёте.

В статье отлично показан сам процесс собеседования как раз на примере приложения Twitter.
​​Жизнь в ОАЭ, Дубай
#экспаты #interview

Те, кто давно на канале, знают, что у нас есть рубрика, где гости, связанные с разработкой, рассказывают о своём опыте переезда и жизни в других странах. И хотя эта рубрика не самая популярная, но лично мне она очень нравится.🤓

Наш следующий гость — Антон Дудаков, который сейчас живёт в ОАЭ, Дубай, а работает в стартапе Ziina Android-разработчиком.

Как всегда, свои вопросы вы можете задать в форме, а дальше начнётся формирование уже готового интервью.

Кстати, пока ожидаете это интервью, вы можете почитать истории ребят из Израиля и Германии. 😎