🎦
Андроиду 18 лет. Какие странности первой версии всё ещё с нами?В этот день в 2008 году вышел Android 1.0 SDK. С тех пор изменились язык и несколько подходов к архитектуре. Зато некоторые решения из самого первого Android пережили всё и зачастую усложняют жизнь разработчикам. Мы поговорили об этом с коллегами, и они вспомнили три примера:
1️⃣ Activity и поворот экранаВо время перехода из горизонтального положения в вертикальное (или наоборот) система по умолчанию пересоздавала Activity, чтобы загрузить ресурсы под новую конфигурацию. Состояние в обычных полях терялось, запрос из onCreate() отправлялся повторно, а старый callback приезжал в прошлый экран.
🔮Сегодня ViewModel помогает пережить смену конфигурации, но не уничтожение процесса. Чтобы его восстановить, нужны сохранённое состояние и постоянное хранилище для важных данных. Android 17 сократил число поводов для пересоздания, но сам механизм остался.
2️⃣
Context и утечка памятиНужна строка? Передай Context. Нужен системный сервис? Передай Context. Сохранил его в синглтоне? Если это Activity, заодно сохранил весь экран и всё, что он удерживает. В итоге пользователь давно ушёл, а экран всё ещё с нами. Очень трогательная утечка памяти.
🛍 Лечение прежнее. Нужно учитывать время жизни объектов и использовать applicationContext для долгоживущих зависимостей там, где он подходит. Для UI контексты не взаимозаменяемы, имеют значение окно, тема и конфигурация.
3️⃣
TextView.setText(18) и проблема с числамиВот одна строка, в которой можно одновременно поздравить Android с днём рождения и воспроизвести проблему — его ровесницу:
textView.setText(18)
Собственно, вместо поздравления мы получим: Resources.NotFoundException. Перегрузка setText(int) принимает ID строкового ресурса. Обычное число прекрасно подходит ей по типу.
🟰 В итоге, если мы хотим показать возраст, нужно передавать текст:
textView.text = 18.toString()
🎉
С днём рождения тебя, Android! Спасибо за обратную совместимость. Особенно за совместимость с ошибками, которых нужно избегать уже 18 лет.Подписывайтесь: 💬
@Yandex4Mobile📹
@YandexforMobile