ar
Feedback

لا تقع ضحية للمخادعين! تيليمتريو يكتشف ويُميّز هذه القنوات 👉 إذا كنت تريد رؤية العلامة، اشترك

По-явански

По-явански

الذهاب إلى القناة على 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 أيام
أرشيف المشاركات
О, нам предлагают посмотреть на байт-код 😍

Понадобилось мне в андроидном приложении сделать фоновой картинке centerCrop. В интернете даже нашёлся (почти) готовый CenterCropDrawable. Так что вот очередная #идея: сделать пачку дроваблов, повторяющих поведение различных ScaleType. Всё достаточно просто: создаём класс вида SomeScaleTypeDrawable( d: Drawable ) : DrawableWrapper(d) , а внутри onBoundsChanged рассчитываем новые размеры, тупо скопировав соответствующий кусок кода из ImageView, и передаём их дочернему дроваблу. Затем берём и… а, погодите-ка, на этом всё.

Сегодня 2⁵ марта, наконец-то круглое число!

Андроидная жизнь кипит Сделал библиотеку для теней — FiftyShades. Обновил гист с кастомным TextView, у которого есть свойства drawableLeft/Top/Right/Bottom/Start/End, реализующие picasso.Target. Записался в хейтеры Coil.

Что будет выведено на экран?
Anonymous voting

Что будет выведено на экран?
Что будет выведено на экран?

Начали.

Всем привет, в следующий четверг, 11 февраля, в 18:00 по МСК будет очередная сессия вопросов и ответов с крайне популярным че
Всем привет, в следующий четверг, 11 февраля, в 18:00 по МСК будет очередная сессия вопросов и ответов с крайне популярным человеком в Android и не только разработке, а именно Михаилом @Harmonizr Ссылка на стрим - https://youtu.be/KR99EpB58_Q Михаил является создателем канала @javanese_online и админом чатов @android_ru, @kotlin_lang и многих других. На этой сессии мы узнаём побольше о нем и как это быть админом крупнейших каналов ру пространства Некоторые факты о Михаиле: - на текущем проекте нет ни одного XML layout - использует MVVM и датабайндинг без помощи гугла - передаёт аргументы во фрагменты через конструктор - нет вышки. Никакой - смотрит доклады Шипилёва с удовольствием и интересом - прошёл в Яндекс без знания алгоритмов - пишет свой индикатор для вьюпейджера быстрее, чем нагугливает подходящий - генерирует 9-патчи на рантайме Бей в колокольчик, чтобы не пропустить

Небезызвестный и замечательный Тагир Валеев показал, как, добавив один метод и статически заимпортировав его, можно сделать в джаве читабельный for по диапазону: for (int i : range(0, 10)) { Он упомянул, что переменная i финальная в теле цикла, её нельзя случайно перезаписать и можно безнаказанно захватывать. От себя добавлю, что это круче, чем IntStream.range(0, 10).forEach(, потому что здесь продолжают работать continue и break.

Строки, символы и Юникод Периодически паршу (парсю?) всякие тексты, и возникает желание собрать качественный материал на тему строк и символов. The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!) by Joel Spolsky: обзор на Юникод без привязки к каким-либо языкам программирования. Storing UTF-8 Encoded Text with Strings from Rust Book: как Юникод представлен в Расте, чем байты отличаются от кодпоинтов или символов и что такое кластеры графем. Так, мы же тут про Джаву. В 1995 казалось, что 65 536 символов хватит всем, поэтому был выбран UTF-16, в котором char — два байта, а .charAt работает за константное время. Но количество символов в Юникоде уже перевалило за миллион, а это чуть больше, чем 65к, поэтому не все символы вмещаются в два байта. В итоге char содержит обман в своём названии, так как может оказаться половинкой длинного символа («суррогатной пары»), .length() иногда привирает, а за константное время можно получить только немного самообмана. Настоящий кодпоинт помещается в int. В классе Character у большинства методов есть оверлоады для char и int. Настоящее итерирование символов можно подсмотреть в ретрофите, например. У CharSequence есть метод .codePoints(), который возвращает IntStream. Так, количество кодпоинтов можно посчитать за линейное время, вызвав .codePoints().count(). Ну а для работы с кластерами графем есть BreakIterator.getCharacterInstance. Уж он-то не только не станет разрывать кодпоинты, но и не будет отковыривать от букв ударения, а от смайлов — модификаторы и джоинеры.

Нашёл изящный способ упасть, если в стриме окажутся дубликаты.
Нашёл изящный способ упасть, если в стриме окажутся дубликаты.

Финансовая математика для IT-инженеров - Сколько нужно денег, чтобы жить на проценты? - Как устроены опционы? - Как ускорить
Финансовая математика для IT-инженеров - Сколько нужно денег, чтобы жить на проценты? - Как устроены опционы? - Как ускорить расчёт доходности облигации в 1000 раз одной строкой кода? IT-инженеры сталкиваются с вопросами из финансовой математики по-разному: из любопытства, при управлении личными финансами, по работе. Многие интересные темы сложно найти за пределами академических источников. Мы считаем это не вполне справедливым. Так появился наш проект. Мы сделали сайт, где собираем материалы, которые доступно рассказывают о нашем увлечении — финансовой математике. В нынешней подборке: видео-лекции, статьи. Скоро: задачи, тесты на проверку знаний по финансовой математике, митапы. Заходите на сайт, смотрите подборку видео и статей. Если знаете полезные материалы по теме, которых пока нет на сайте — предлагайте! Самые интересные обязательно опубликуем. Надеемся, вместе мы сможем сделать финансовую математику чуть более доступной для IT-инженеров https://finmath4it.ru/

Пара слов о гонках в обзёрваблах Property в @kotlin_lychee — это аналог Property в JavaFX или BehaviorSubject в RxJava: можно читать значение, подписываться на изменения и отписываться от них, а в MutableValue можно присваивать новое значение. В принципе понятно, какие гонки бывают в многопоточном окружении, поэтому расскажу только об однопоточных гонках. Когда значение проперти меняется, об этом должны узнать все подписчики. А значит, проперти в цикле вызывает коллбэки с чужеродным кодом. Который вполне может: • присвоить проперти новое значение. Тут примитивная реализация уйдёт в рекурсию, разнесёт всем новое значение, а потом вернётся по стеку и продолжит разносить старое значение. В Lychee же проперти хоть и сразу меняет значение, но уведомляет строго в порядке очереди; • отписаться. Примитивная реализация может хранить подписчиков в COWArraySet, чтобы не вылетало ConcurrentModificationException, но этого мало: нельзя уведомлять отписавшихся, нужно удалять сразу; • добавлять новых подписчиков. У проперти всегда можно считать свежее значение, которое будет более актуальным, чем то, которое мы доставляем прямо сейчас. Поэтому подписчики ставятся в очередь и не получают несвежие значения. Тут нужно добавить, что проперти «холодные» и «ленивые». Например,
val nProp = propertyOf(0)
val facProp = nProp.map(::factorial)
repeat(100500) { nProp.value = it }
Функция factorial вызовется ноль раз, ведь никто не подписан на facProp и не запрашивал значение. То есть проперти всегда знает, смотрят ли на него или можно расслабиться. Теперь к делу. Я запилил LazyView — эдакий ViewStub для вёрстки из кода:
addView(
  lazyView(visibleProp) {
    mySuperHeavyView()
  }
)
Дальше происходит следующее: • пользователь, нажимая кнопку, присваивает true в какое-то проперти; • visibleProp зависит от него через серию всяких map и тоже становится true (а мы прямо сейчас уведомляем подписчиков об изменении); • LazyView выпиливается из контейнера, отписывается от visibleProp, создаёт superHeavyView и подписывает его на ту же visibleProp; * кнопка отваливается, все последующие клики бесполезны. Правда, можно отправить экран в бэкстек и вернуться на него, тогда всё оживёт. И что это было?! 1. Я ошибся, когда разрабатывал механизм уведомления, решив, что если мы сейчас уведомляем, значит, на нас хоть кто-то подписан. Звучит логично, но нет: можно же отписаться прямо в процессе уведомления. А потом подписать кого-нибудь ещё. Состояние «на меня смотрят» всё же может меняться. 2. Исправил, завалил другой тест: в одной из реализаций проперти я позабыл, что подписчики бывают не только «нормальные», но и ждущие в очереди. Поэтому, если кто-то отписывается, но отсутствует в списке «нормальных», нужно проверить ещё и очередь. Коммит для любителей пожёстче · Релиз · Тред в Твиттере на английском

В докладе есть пример, где я рисую заголовок с помощью ItemDecoration. Удобно, что не нужно добавлять вьютайпы. Хорошо, что такой текст не требует текствьюшки и рисуется очень быстро. Но я забыл озвучить один нюанс: accessibility. Экранные дикторы не видят этого текста. Поэтому делать заголовки декораторами я всё-таки не рекомендую.

Аргументы фрагмента Заезженная тема, но общепринятого варианта, кажется, не существует. Как это делаю я: * прячу дефолтный ко
Аргументы фрагмента Заезженная тема, но общепринятого варианта, кажется, не существует. Как это делаю я: * прячу дефолтный конструктор, чтобы он был доступен только рефлекшену; * делаю конструктор (не фабрику!) с параметрами, который сохраняет аргументы; * делаю геттеры (не by lazy!) аргументов.

Speaker's Deck рукожопит, поэтому так.

Начинаем начинать!

Друзья, привет! Android Academy SPb запускает онлайн-курс Android Advanced. И наша первая тема — Views & Graphics! Меня зовут Михаил Горюнов @Harmonizr, я Android-разработчик-фрилансер. И 22 октября я подробно расскажу, как в Android работают View. На примерах покажу, как писать свои и вьюхи и ViewGroup, Drawable и ItemDecoration. Также поговорим про работу Canvas, Paint и Shaders. Лекция будет полезна как начинающим, так и опытным разработчикам. Не пропустите! 😉 Регистрация