Какие вопросы задают на собеседовании Android-разработчику

Здесь говорится о реактивном стиле программирования на Java 8.

Coroutines Kotlin VS RxJava в асинхронном коде

Думаю, для тех, кто не знаком с Kotlin, стоит сказать пару слов о нем и корутинах в частности. Об актуальности изучения Kotlin говорит то, что в мае 2017 года компания Google сделала его официальным языком разработки Android.

Проекты, стартующие в нашей компании, мы пишем на Kotlin, поэтому изучаем существующие возможности и следим за выходом новых. Когда создатели языка анонсировали корутины как новый инструмент асинхронного программирования, стало интересно протестировать их в боевых условиях. Судя по описанию возможностей, они как раз подходят для решения наших задач и отличаются в лучшую сторону от уже существующих решений.

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

В контексте Android в задачах обеспечения асинхронности их смело можно рассматривать как конкурента RxJava. Несмотря на то, что возможности RxJava гораздо шире (это довольно объемная библиотека со своим подходом и философией), работать с корутинами удобнее, потому что они — всего лишь часть языка программирования. Задачи, решенные на RxJava с помощью операторов (специальных методов библиотеки), на корутинах реализуются намного проще — через встроенные средства языка. К тому же операторы библиотек нужно не только знать, но и понимать, как они работают, правильно выбирать и применять. Конечно, средства языка знать и правильно применять тоже нужно, но, когда речь идет о сокращении времени на разработку, стоит задуматься, насколько изучение возможности библиотеки, которую используешь для решения небольшой задачи, актуально в сравнении с изучением языка, на котором пишется весь проект.

Читайте также:  Фишинг и целевой фишинг: советы по защите

Пример общения между компонентами Angular 2, 4, 5

Здесь простой пример который показывает общение между компонентами app через сервис используя Observable. (Так-же код доступен на GitHub).

История изменений:

  • 23 мая 2017 – Обновились до Angular 4.1.3
  • 01 декабря 2016 – Работало на Angular 2.2.1

Запуск данного примерно локально

  1. Установите NodeJS (> v4) and NPM (> v3) отсюда , можно проверить установленную версию прописав в консоли команды node -v и npm -v.
  2. Скачайте код проекта с GitHub.
  3. Установите все зависимости проекта прописав в консоли команду npm install. Писать команду нужно в корневой директорий.
  4. Запустите приложение прописав команду npm start так-же в корневой директорий.

Что можно наблюдать?

По сути, Observable — это ленивый Push-набор из нескольких значений. Они обеспечивают непрерывный канал связи, в котором с течением времени могут передаваться несколько значений данных.

Angular широко использует Observables как в HTTP-сервисе, так и в системе событий.

RxJS предлагает ряд функций, которые можно использовать для создания observables.

1. Использование функции of

2. Использование функции from

передавая обещание от функции

передавая массив чисел из функции

3. Использование функции fromEvent

Передача события click в функцию fromEvent

4. Использование функции interval

Передача таймера в функцию интервала

Вот некоторые из распространенных способов создания Observables в RxJS.

Альтернативы реактивного подхода

Давайте подумаем, можно ли обойтись без реактивного программирования?

Альтернативы реактивного подхода

Можно использовать callback-функции, например, библиотека Java Swing так реализована (вызывается callback-функция на каждый клик, нажатие кнопки в графическом интерфейсе и т.п. действия пользователя). С Java 8 эти callback-функции можно совместить с lambda-выражениями. Но все, кто имел дело с callback-функциями, знают, что начиная с некоторого уровня вложенности все это трудно читать и поддерживать. Вот пример подобного кода:

Читайте также:  11 лучших приложений для камеры на Android

То есть это асинхронный код, но читать его трудно.

Альтернативы реактивного подхода

Вот еще варианты, которые, как показалось бы,  могли бы подойти, но нет:

ReactiveX

Воплощать с нуля идеи реактивного программирования может быть довольно хлопотно — есть подводные камни, да и времени это займет прилично. Поэтому для многих разработчиков эта парадигма оставалась только теоретическим материалом, пока не появился ReactiveX.

Фреймворк ReactiveX — это инструмент для реактивного программирования, работающий со всеми популярными ООП-языками. Сами создатели называют его мультиплатформенным API для асинхронной разработки, основанным на паттерне «Наблюдатель» (Observer).

ReactiveX

Если термин «реактивное программирование» — это своего рода теоретическая модель, то паттерн «Наблюдатель» — готовый механизм отслеживания изменений в программе. А отслеживать их приходится довольно часто: загрузку и обновление данных, оповещения о событиях и так далее.

Рис. 1. Паттерн «Наблюдатель»Другие статьи в выпуске: Xakep #214. Приручаем WAF’ы

  • Содержание выпуска
  • Подписка на «Хакер»

Паттерн «Наблюдатель» существует примерно столько же, сколько и само ООП. Объект, состояние которого может поменяться, называется издателем (популярный перевод термина Observable). Все остальные участники, которым интересны эти изменения, — подписчики (Observer, Subscriber). Для получения уведомлений подписчики регистрируются у издателя, явно указывая свой идентификатор. Издатель время от времени генерирует уведомления, которые им же рассылаются по списку зарегистрированных подписчиков.

ReactiveX

Собственно, создатели ReactiveX не придумали ничего революционного, они просто удобно реализовали паттерн. И хотя во многих ООП-языках, и в Java в частности, есть готовые реализации паттерна, в этом фреймворке присутствует дополнительный «тюнинг», который превращает «Наблюдатель» в очень мощный инструмент.

Android

  • принципы SOLID и чистая архитектура;
  • активити и методы жизненного цикла, onSaveInstanceState/onRestoreInstanceState;
  • фрагмент и методы жизненного цикла;
  • контекст;
  • сервисы;
  • Broadcast Receiver;
  • интенты;
  • Handler/Looper;
  • AsyncTask;
  • что такое процесс;
  • Inter Process Communication;
  • сериализация и парселизация;
  • view: жизненный цикл, кастомные view;
  • Flavours/Builds;
  • архитектура MVP и MVVM;
  • многомодульность;
  • что такое OkHttp и зачем он нужен;
  • RxJava:
    • Hot и Cold observables;
    • разница между map и flatMap;
    • как создавать Observable;
    • разница между RxJava 1 и RxJava 2;
    • что такое BackPressure.
  • Dagger 2:
    • аннотация Named;
    • скоупы в Dagger 2.
Читайте также:  4 вещи которые мой старый Macbook Pro делает лучше нового

Проверка навыков программирования происходит нечасто. Обычно кандидату дают какой-либо сайт, где можно писать псевдокод прямо в окне браузера. Его видят обе стороны собеседования. Часто дают небольшие задачи по сортировке элементов в списке или получению того или иного элемента. Вот что нужно, чтобы подготовиться к таким задачам:

  • тренироваться в ветвлениях и условиях;
  • знать, что такое предикат;
  • знать основные методы пакетов Colleсtions, Array, которые работают с преобразованием коллекций и сортировкой;
  • решать задачи на алгоритмы и сортировки.

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

Щипок и долгое нажатие в Google Photos — удобное управление снимками

Жесты в Google Photos значительно упрощают использование смартфона. К примеру, вы можете быстро менять формат отображения снимков щипком, даже не заходя в дополнительное меню. Достаточно сводить и разводить два пальца поверх списка фотографий, и приложение будет переключать вид: обычный, по дням, по месяцам, по годам.

Щипок и долгое нажатие в Google Photos — удобное управление снимками
Щипок и долгое нажатие в Google Photos — удобное управление снимками

Кроме того, вы можете быстро выделить множество изображений. Для этого задержите касание на одном из нужных снимков и, не отрывая пальца от экрана, проведите им по остальным.

Щипок и долгое нажатие в Google Photos — удобное управление снимками
Щипок и долгое нажатие в Google Photos — удобное управление снимками