По-явански
رفتن به کانال در Telegram
Пишу про Java-технологии, Kotlin и Android-разработку. Редко но метко. Кодревью: http://javanese.online/%D1%80%D0%B0%D0%B7%D0%B1%D0%BE%D1%80_%D0%BA%D0%BE%D0%B4%D0%B0/ Поболтать IRL: @coffeeCodeEverywhere Автор: @Harmonizr Менеджер по рекламе: /dev/null
نمایش بیشتر827
مشترکین
اطلاعاتی وجود ندارد24 ساعت
-17 روز
+530 روز
آرشیو پست ها
827
IllegalStateException: cannot make a new request because the previous response is still open: please call response.close()
Занятный крэш меня сегодня посетил. Типовое обновление токена. Нетрудно понять, где именно баг, но как именно вы бы его чинили?827
Вопрос, который мне не задали на конференции: является ли SVG path-data Тьюринг-полным языком?
827
Курс по ФП на Java
Знаю, что «восьмёрке» уже восемь лет, но этот курс мне скинули буквально месяц назад. Функциональная композиция, стримы-коллекторы, CompletableFuture и прочие монадки в задачах и примерах.
https://stepik.org/course/91497/syllabus
827
Опять про андроид. И снова сохранение состояния
Есть паттерн такой — назовём его custom composite view: наследуем любой подходящий layout, инфлейтим внутрь него
<merge> и переиспользуем целиком. Описан в этой статье и много где ещё.
Но, как говорится, есть один нюанс. Если на экране более одного такого компонента, айдишки внутри начинают дублироваться. В итоге при сохранении состояния побеждает тот, кто сохранялся последним, щедро раздавая всем компонентам своё состояние при восстановлении. Для вьюшек с пользовательским вводом, таких как текстовые поля, слайдеры, чузеры и вот это всё, проблема прям критичная.
Нужно переопределить dispatch(Save|Restore)InstanceState, которые отвечают за сохранение-восстановление всего поддерева. Далее — вариации:
а) можно вызвать dispatch(Freeze|Thaw)SelfOnly(container), как это делает ресайклер, и в on(Save|Restore)InstanceState сделать всю нужную работу. Придётся унаследовать SavedState, к сожалению;
б) а можно взять какой-нибудь ParcelableSparseArray и передать его в super.dispatchSaveInstanceState и положить его в container под своим id, изолировав таким образом состояние всего компонента в отдельное пространство айдишек.827
Платформа для донатов
Очередная #идея, которую я (да ладно, будем честны, подслушал и) дарю любому банку/финтеху.
Организация или отдельно взятый волонтёр открывает специальный счёт для донатов. Для счёта генерируется специальная общедоступная страничка — там эквайринг и история операций, к которой автоматом прикрепляются электронные чеки.
Всё, любой благотворительный проект может вылезти из пещерного века, выбросить камень, плуг, соху, десять карт разных банков и систем (потому что эквайринг) и гигабайт фоток чеков на телефоне.
827
Adapter Delegates
Почему я не использую «классические» адаптерДелегаты?
Смотрим невооружённым глазом:
val adapter = ListDelegationAdapter<List<Animal>>(
catAdapterDelegate(...),
А если приподнять завесу «няшного» Kotlin DSL, то вообще увидим ЭТО:
public boolean isForViewType(List<Animal> items, int position) {
return items.get(position) instanceof Cat;
}
Напрашивается следующий вывод:
• можно забыть нужный делегат (крэш в рантайме),
• а можно забыть удалить лишний (недостижимый код),
• нельзя использовать несколько делегатов для одного типа данных.
Первые два пункта — классика: в Retrofit можно переехать с RxJava на suspend и забыть убрать CallAdapter.Factory, а в Gson есть «изкоробочные» адаптеры для, скажем, AtomicIntegerArray, которые психически здоровому человеку не нужны, а больному — вредны.
Третий пункт — ваще критикал: я хочу пару разных делегатов-заголовков, оба с типом CharSequence но разными шрифтами, отступами, размерами. Или в вертикальном списке имею горизонтальные списки всякого разного, которые сплошь instanceof List.
Короче, я создал, хоть и столько лет спустя.
Под капотом там просто сдвоенный List из элементов и их делегатов.
В комплекте валяется ItemDecoration, который могёт… а, не буду пересказывать скриншот, он в конце readme.
Лучи добра всем трудящимся!827
Gson 2.9.0
Пару месяцев назад тихой сапой вышло обновление объекта обожания всех рефлектологов и ансейфоведов.
Моё внимание привлекли эти два изменения:
• Support
EnumMap deserialization (#2071)
• Add GsonBuilder.disableJdkUnsafe() (#1904)
Вот и отлично! Не прошло и десяти л… а, нет, прошло :)
Того гляди, скоро и EnumSet начнёт поддерживать.
https://github.com/google/gson/blob/master/CHANGELOG.md827
Пять стадий написания LayoutManager
1. 😨 Быть такого не может, чтобы ранее такую штуку никто не делал!
2. 😡 Нет, ну почему никто не запилил?!
3. 🤬 Может, как-нибудь попроще, без менеджера?
4. 😢 *гуглинг в гитхабе*
5. 😌 Ладно-ладно, пойду писать.
Итого: Flow (раскладывает в строчку, переносит на новую при необходимости) с возможностью ограничить количество строк и показать специальную вьюшку «ещё 100500».
https://github.com/Miha-x64/FlowLayoutManager/
827
Пять стадий написания LayoutManager
1. 😨 Быть такого не может, чтобы ранее такую штуку никто не делал!
2. 😡 Нет, ну почему никто не запилил?!
3. 🤬 Может, как-нибудь попроще, без менеджера?
4. 😢 *гуглинг в гитхабе*
5. 😌 Ладно-ладно, пойду писать.
Итого: Flow (раскладывает в строчку, переносит на новую при необходимости) с возможностью ограничить количество строк и показать специальную вьюшку «ещё 100500».
https://github.com/Miha-x64/FlowLayoutManager/
827
Концентрированная мудрость
Ежедневно я пишу код, коплю опыт и делаю выводы. Каждые десять лет у меня выкристаллизовывается ровно одно идеальное, чётко сформулированное и неопровержимое утверждение. Впервые я делюсь своим арсеналом, накопленным за всю сознательную жизнь.
• Глобальные переменные — сила. Легко дебажить, сразу видно всё состояние приложения, как на ладони. Нет необходимости передавать какие-либо параметры в функции.
• Полиморфизм — мракобесие: разобраться в нём — это как выбрать себе подходящий гендер из 50 вариантов.
• Вариативные дженерики нужны только для написания диссертаций на эту тему.
• В рестухе коды состояния излишни. Всегда отвечай 200 Ок, ошибку же можно вернуть в теле ответа.
• Главное топливо для работы — кофе. На завтрак, обед и ужин.
• Решение абсолютно любой проблемы можно копипастить со стека. Люли там неглупые, сообщество активное, а значит, и код 100% рабочий и качественный.
• Самая важная языковая фича — деструктор. Особенно в джаве! Правильно написанный конструктор в руках умелого прогера превращается в мощный деструктор.
827
Repost from EasyCodeRu
Весь путь андроид разработки с 2015 по сегодняшний день за 4 часа: в гостях Миша @Harmonizr
https://www.youtube.com/watch?v=LG_C-igSTP8
827
О, у меня ж ревью на днях вышло.
Немного про ProGuard rules, чучуть про анимации, капельку про навигацию, ну и всякое по мелочи.
