Обновить
49.67

Kotlin *

Статически типизированный язык программирования

Сначала показывать
Порог рейтинга
Уровень сложности

Пробуем Jetpack Compose в бою?

Время на прочтение7 мин
Количество просмотров21K

Наконец, настал момент, когда не нужно собирать самостоятельно Android Studio, чтобы попробовать новый декларативный UI framework для Android. Jetpack Compose стал доступен в виде первого Dev Preview в Maven-репозитории Google. С такой новости началось моё утро понедельника. И сразу же возникло желание посмотреть, что из себя представляет набор инструментов, который так ждали.


Читать дальше →

Как внедрить аналитику и не сломать приложение?

Время на прочтение7 мин
Количество просмотров6.5K
Привет! Меня зовут Соснин Илья. Я работаю в Lamoda Android разработчиком. Крашу кнопочки, прогаю списочки и, к сожалению, пишу аналитику…

Lamoda — это Data Driven Company, в которой все решения принимаются на основе поведения пользователей. Сначала мы наблюдаем и только потом делаем выводы. Поэтому несложно догадаться, что аналитика у нас есть, и она нам очень нужна.

В расшифровке моего доклада митапа Mosdroid #18 Argon я расскажу, как устроен наш SDK и почему рефлексия — это не всегда плохо. А также отвечу на главный вопрос этой темы: «Как внедрить аналитику и не сломать приложение?».
image
Для начала задам один простой вопрос: “Как вы думаете, сколько у нас установок в Google play?”.
Читать дальше →

Проблемы пакетной обработки запросов и их решения (часть 2)

Время на прочтение25 мин
Количество просмотров2.9K

Это продолжение статьи «Проблемы пакетной обработки запросов и их решения». Рекомендуется сначала ознакомиться с первой частью, так как в ней подробно описана суть задачи и некоторые подходы к ее решению. Здесь же мы рассмотрим другие методы.
Читать дальше →

Continuous delivery для вашей Kotlin Multiplatform библиотеки

Время на прочтение12 мин
Количество просмотров3.7K

Logo


Привет! Меня зовут Юрий Влад, я Android-разработчик в компании Badoo и принимаю участие в создании библиотеки Reaktive — Reactive Extensions на чистом Kotlin.


В процессе работы мы столкнулись с тем, что в случае с Kotlin Multiplatform continuous integration и continuous delivery требуют дополнительной настройки. Необходимо иметь в распоряжении несколько виртуальных машин на различных операционных системах, чтобы собрать библиотеку полностью. В этой статье я покажу, как настроить continuous delivery для вашей Kotlin Multiplatform библиотеки.

Читать дальше →

Generic Recycler View или как не писать шаблонный код

Время на прочтение4 мин
Количество просмотров8.3K
Все мы пишем приложения и у всех нас есть списки. И самое очевидное решение это RecyclerView. Сама по себе реализация не сложна и писать гайд по RecyclerView уже не актуально. Но есть одно но. Каждый раз когда нам нужен список мы создаем класс, в нем прописываем шаблонный методы, создаем шаблонные классы. Когда у нас 2-3 списка то ничего страшного в этом нет. Но когда их 10 или того более, то этого делать уже не хочется.

И вот столкнувшись с проблемой я начал искать. Нашел одну очень интересную реализацию на Kotlin. Она мне понравилась, но в ней не хватало нескольких элементов. Потратив еще пару часов, я смог доработать его и теперь реализация адаптера занимает несколько строчек. И здесь я хочу поделиться ею с вами.

Первое что нам необходимо сделать это создать адаптер.

abstract class GenericAdapter<T> : RecyclerView.Adapter<RecyclerView.ViewHolder> {
    private var itemList = mutableListOf<T>()

    constructor()

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
        return getViewHolder(
            LayoutInflater.from(parent.context)
                .inflate(viewType, parent, false)
            , viewType
        )
    }

    override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
        (holder as Binder<T>).bind(itemList[position], itemClickListener)
    }

    override fun getItemCount(): Int = itemList.size

    override fun getItemViewType(position: Int): Int = getLayoutId(position, itemList[position])

    fun update(items: List<T>) {
            itemList = items.toMutableList()
            notifyDataSetChanged()
    }

    protected abstract fun getLayoutId(position: Int, obj: T): Int

   protected open fun getViewHolder(view: View, viewType: Int): RecyclerView.ViewHolder {
        return ViewHolderFactory.create(view, viewType)
    }

    internal interface Binder<T> {
        fun bind(data: T)
    }
}
Читать дальше →

Обработка ошибок в функциональном стиле в Java

Время на прочтение2 мин
Количество просмотров5.5K
Кроме классического подхода для обработки ошибок с помощью исключений, можно выделить также функциональный подход.

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

Например, в языке Scala для этого используется определенный класс Try.

def inputStreamForURL(url: String): Try[Try[Try[InputStream]]] = parseURL(url).map { u =>
     Try(u.openConnection()).map(conn => Try(conn.getInputStream))
}

В Java мире с помощью библиотеки Vavr также можно обрабатывать ошибки в функциональном стиле.
Читать дальше →

Kaspresso: фреймворк для автотестирования, который вы ждали

Время на прочтение7 мин
Количество просмотров34K
Все, кто занимался или занимается автотестами под Android, знают, какая это боль.
От объема задач и проблем устаешь так, что и отпуск не помогает. Люди даже увольняются из-за автотестов.

Боль, страдания и мучения неизбежно приводят к появлению чего-то нового и прекрасного. Мы постарались собрать вместе все грабли, на которые нам пришлось наступить, объединили свои усилия с ребятами из «Авито» и HH и создали то, что сделает ваши отношения с автотестами несравнимо лучше и плодотворнее.

Встречайте: Kaspresso — фреймворк для автотестирования, который вы ждали!


Читать дальше →

Почему вам стоит выкинуть MVP из своих проектов

Время на прочтение4 мин
Количество просмотров15K

Всем привет! Сегодня я бы хотел поговорить об архитектуре Android-приложений.
На самом деле я не очень люблю доклады и статьи на данную тему, но недавно ко мне пришло осознание, с которым я бы хотел поделиться.

Читать дальше →

Пять перспективных языков программирования со светлым будущим (3 года спустя)

Время на прочтение8 мин
Количество просмотров71K

КДПВ


В 2016-м году я опубликовал перевод статьи про 5 перспективных языков программирования, в которой прогнозировался их рост в ближайшие 2-3 года.
Зачастую прогнозы так и остаются прогнозами, без последующего анализа. Но я решил, что это непорядок. И посколько 3 года уже пролетели, пора подвести промежуточные итоги и посмотреть, что произошло с этими языками за это время.


Однако, прежде чем мы перейдём к пятёрке наших героев, хочется уделить немного внимания предсказанному в той же статье переходу Swift и Go из второго эшелона в первый.


про эшелоны

В исходной статье языки программирования условно делятся на 3 эшелона по популярности.
Первый эшелон включает мейнстрим-языки, такие как Java, JavaScript, Python, Ruby, C# и т.д.
Языки второго эшелона пытаются пробиться в мейнстрим, но ещё не добились этого. Они доказали свою состоятельность путем создания сильных сообществ, но они до сих пор не используются большинством консервативных IT-компаний. Большинство языков в первом эшелоне прочно укоренились на своих позициях. Поэтому выпадение языка с лидирующих позиций занимает ощутимое время, а для языка второго эшелона очень трудно пробиться в первый.
К третьему эшелону относятся непопулярные языки, а также относительно новые перспективные языки (о которых пойдёт речь), которые только начинают свой путь наверх. Некоторые языки пребывают в третьем эшелоне на протяжении многих лет, не получая популярности, в то время как другие врываются на сцену всего за пару лет.

Читать дальше →

По следам русского Scala-движа. Часть 2

Время на прочтение17 мин
Количество просмотров3.8K
В прошлой части расследования Роман Тимушев посоветовал связаться с Владом, что я и сделал. Влад уточнил, что меня интересует, делайны и согласился написать несколько абзацев. На следующее утро я увидел уведомление в Facebook. Это Влад нашел нового свидетеля — Александра Подхалюзина. С 2008 по 2017 он работал как тимлид над Scala plugin в IDEA и лично видел все развитие Scala-движения, но, в основном, не российскую часть.

В голове «щелкнуло» — планы меняются, это новая нить в расследовании. Обозначили время и записали часовое интервью с Александром. Информации столько, что вместить его куда либо кроме отдельной части не было вариантов. Поэтому, предупреждаю — впереди много текста.



В этой части говорим с Александром Подхалюзиным и Михаилом Муцянко. Вне программы — комментарий Ильи Сергея. Scala plugin, первые Scala-мероприятия в России, уход в Kotlin, Native на обоих языках, закат Eclipse и многое другое под катом.
Читать дальше →

Разрабатываем приложение, которое отсылает данные другим приложениям (экосистемное приложение)

Время на прочтение3 мин
Количество просмотров4.2K
Привет, ребята!

Это моя вторая статья про разработку своего проекта. Тем, кто не читал предыдущую статейку: она про то, как из одного места (гугл таблицы) автоматически экспортировать данные в другое (ноушн).

Сегодня я расскажу, как я писал (и проектировал) библиотеку для того, чтобы сторонние приложения могли получать данные, отправляемые моим приложением. Всех заинтересовавшихся прошу под кат.
Читать дальше →

Веб-приложение на Kotlin + Spring Boot + Vue.js

Время на прочтение40 мин
Количество просмотров49K
Добрый день, дорогие обитатели Хабра!

Не так давно мне представилась возможность реализовать небольшой проект без особых требований по технической части. То есть, я был волен выбирать стек технологий на своё усмотрение. Потому не преминул возможностью как следует «пощупать» модные, молодёжные многообещающие, но малознакомые мне на практике Kotlin и Vue.js, добавив туда уже знакомый Spring Boot и примерив всё это на незамысловатое веб-приложение.
Посмотреть, что из этого вышло

Полнотекстовый поиск в Android

Время на прочтение7 мин
Количество просмотров9.7K
В мобильных приложениях очень востребована функция поиска. И если в небольших продуктах ею можно пренебречь, то в приложениях, которые предоставляют доступ к большому количеству информации, без поиска не обойтись. Сегодня я расскажу, как правильно реализовать эту функцию в программах под Android.


Читать дальше →

Ближайшие события

Dagger 2 – это элементарно (Часть 2)

Время на прочтение4 мин
Количество просмотров18K
Предыдущая часть

Содержание

  1. Внедрение методов и полей
  2. Отложенная инициализация в dagger
  3. Модули dagger. Когда dagger вас не понимает
  4. Аннотация Named. Несколько экземпляра одного типа

Внедрение методов и полей
Читать дальше →

Dagger 2 – это элементарно (Часть 1)

Время на прочтение3 мин
Количество просмотров61K
Содержание

  1. Введение
  2. Что такое Dependency Injection, Пример зависимости
  3. Dagger 2 – введение
  4. Первое использование Dagger 2

Введение


Статья написана не продвинутым программистом для таких же, обычными и понятными словами
В статье используется пример кода на Kotlin. Версия dagger 2.17. Пример можно скачать в конце статьи.
Читать дальше →

Рецепты TeamCity. Доклад Яндекс.Такси

Время на прочтение8 мин
Количество просмотров9.4K
Меня зовут Эдуард Мацуков, я делаю Таксометр — приложение для водителей Яндекс.Такси. Занимаюсь инфраструктурой и всем, что с ней связано. Какое-то время назад я выступил с докладом — рассказал об опыте дружбы TeamCity с нашим проектом и с разработчиками в целом. Отдельная часть доклада посвящена тому, при чем здесь Kotlin.


— Практически каждый день ко мне лично и к нашим разработчикам приходят с вопросами. А где достать сборку? А где взять такую-то ветку? А почему что-то упало? Где в моем коде проблема? Почему что-то работает неправильно? Для этого у нас в проекте есть много самописной инфраструктуры, плагинов, различных хаков и трюков, которые мы используем. С одной стороны — чтобы облегчить жизнь разработчика, с другой — чтобы реализовать конкретные бизнес-задачи.

От копипасты к компонентам: переиспользуем код в разных приложениях

Время на прочтение12 мин
Количество просмотров9.8K


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

Развитие каждого проекта происходило по-своему. Влияние на кодовую базу оказывали не только разные временные рамки и продуктовые решения, но и видение разработчиков. В конце концов мы заметили, что проекты имеют одинаковую функциональность, которая при этом кардинально отличается в реализации.

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

Уровень Android API, обратная и прямая совместимость

Время на прочтение7 мин
Количество просмотров79K
Добрый вечер, друзья. Мы подготовили полезный перевод для будущих студентов курса «Android-разработчик. Продвинутый курс». С радостью делимся с вами данным материалом.




Если вы читаете эту статью, значит вас могут интересовать такие вещи, как:

  • Что означает уровень API?
  • Как использовать compileSdkVersion, minSdkVersion или targetSdkVersion?
  • Как можно гарантировать, что приложение будет работать правильно на устройствах с разными версиями ОС?
Читать дальше →

Как я сделал кастомный прерыватель Okhttp через котлиновские корутины

Время на прочтение4 мин
Количество просмотров4.8K
Начнём с постановки задачи.

  1. Надо в каждом запросе в header’s отправлять токен и id юзера
  2. Надо из каждого ответа вытаскивать из headers новый токен и id юзера
  3. Полученные данные надо сохранять

Библиотека для серверного взаимодействия – Retrofit. За многопоточность отвечают корутины.
Задача не сложная, надо просто добавить прерыватель Okhttp client в каждый запрос. Полчаса и всё готово, всё работает, все рады. Но мне стало интересно, а нельзя ли сделать прерыватель без Okhttp клиента?
Читать дальше →

Реализация union типов в Java

Время на прочтение5 мин
Количество просмотров8.6K
При разработке кода иногда нужно чтобы объект в определенный момент содержал значения одного типа или значения другого типа. Языки программирования, которые поддерживают концепцию объединений, позволяют в определенный момент сохранять текущее значение в одной области памяти.
Читать дальше →