Android Interview Review

@AndroidSobes Нравится 2 1 500

Популярные вопросы и ответы с собеседований на Android-разработчика.
Канал для Java-разработчиков @JavaSobes
Связаться с нами @SobesAdmin
https://itsobes.ru
Гео и язык канала
Россия, Русский
Категория
Образование


Написать автору
Гео канала
Россия
Язык канала
Русский
Категория
Образование
Добавлен в индекс
18.03.2019 05:12
реклама
SearcheeBot
Ваш гид в мире Telegram-каналов
TGAlertsBot
Мониторинг упоминаний ключевых слов в каналах и чатах.
TGStat Bot
Бот для получения статистики каналов не выходя из Telegram
2 304
подписчиков
~2.4k
охват 1 публикации
~1.5k
дневной охват
~4
постов / нед.
105.4%
ERR %
5.59
индекс цитирования
Репосты и упоминания канала
15 упоминаний канала
2 упоминаний публикаций
0 репостов
Clean Code
Kosmos Time
Next Time
Android Live 🤖
Лысый из браузера
Java Interview Review
Говнокод
Clean Code
Coding
Java Interview Review
IT Юмор
Программист
Говнокод
Каналы, которые цитирует @AndroidSobes
Java Interview Review
Java Interview Review
Java Interview Review
Java Interview Review
Java Interview Review
Лысый из браузера
Android Live 🤖
Java Interview Review
Java Interview Review
Java Interview Review
Java Interview Review
Java Interview Review
Java Interview Review
Java Interview Review
Java Interview Review
Java Interview Review
Последние публикации
Удалённые
С упоминаниями
Репосты
Выпуск подкаста о том, почему компании часто не дают фидбэк после неудачного собеседования.

https://softskills.audio/2018/04/30/episode-107-no-interview-feedback-and-newsletter-politics/

#пятница
Как прослушивать lifecycle коллбэки всех активити в приложении?

Класс Application имеет метод registerActivityLifecycleCallbacks(), который принимают параметром интерфейс ActivityLifecycleCallbacks. Этот метод позволяет зарегистрировать коллбэк, который сообщает о вызове методов жизненного цикла всех активити в приложении.

Эта функциональность бывает полезна, когда вам необходимо узнать о создании активити, принадлежащей сторонней библиотеки (нет возможности изменить код активити).
Также registerActivityLifecycleCallbacks() можно использовать если вы разработчик библиотеки, в которой необходимо знать о создании активити в приложении.

Для удаления коллбэка используется метод unregisterActivityLifecycleCallbacks().

#Components
Читать полностью
В чем разница между ListView и RecyclerView?

RecyclerView был создан как улучшенная замена ListView. Основные отличия следующие:

1. RecyclerView переиспользует ячейки списка при скроллинге. Для реализации этой логики используется класс ViewHolder.
В ListView тоже можно реализовать адаптер с ViewHolder, но это необязательно и требует написания бойлерплейт кода.

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

3. Логика отображения анимации элементов вынесена из RecyclerView в класс ItemAnimator.

В целом RecyclerView имеет более гибкий API, чем ListView, благодаря хорошему дизайну и соответствию принципу единственной ответсвенности.

#View
Читать полностью
Вчера Google задеприкейтил AsyncTask. Видимо наш пост стал последней каплей.

https://www.xda-developers.com/asynctask-deprecate-android-11/

#пятница
Чем плох AsyncTask?

Все знают, что AsyncTask – это плохо и лучше его не использовать. На собеседовании могут спросить, почему это так.

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

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

3. Неудачный API. Часто работа с бэкграунд тредом в андроид-приложениях – это запрос в сеть или базу данных. Для обработки результата достаточно методов onSuccess() и onError(). AsyncTask предоставляет обычно ненужные коллбэки onPreExecute() и onProgressUpdate(), а также метод onPostExecute(), который вызывается в случаях и успешного выполнения, и ошибки. Это требует писать больше бойлерплейта.

4. На разных версиях андроида выполнение нескольких AsyncTask реализовано по-разному:

• До Api level 4 использовался единственный тред и все AsyncTask выполнялись по очереди.
• Начиная с Api level 4 и до 11 использовался тред пул и AsyncTask выполнялись параллельно.
• Начиная с Api level 11 снова начали использовать единственный тред.

Такие изменения вызывали путаницу и баги в приложениях.

#OS
Читать полностью
🚀 Потребительские технологии развиваются настолько быстро, что уследить за ними и разобраться бывает непросто.

Редакция блог-платформы Хайп регулярно публикует актуальные полезные статьи о гаджетах и технике:
• Сравнение устройств
• ТОПы
• Ответы на популярные вопросы
• Обзоры
• Переводы публикаций ведущих зарубежных изданий и многое другое в одном месте.

✨Более того, каждый желающий может вести блог на ЛЮБУЮ тему на ресурсе, аудитория которого достигает 1 млн читателей в месяц.

Следить за последними публикациями можно в уютном telegram-канале — https://t.me/hyperunews

Приобщайся, не пропусти интересное чтиво!
Читать полностью
Как запустить стек из нескольких активити?

Для старта стека из нескольких активити используется класс TaskStackBuilder.

После вызова метода startActivities() (см. картинку), стартует только activity3. Информация об activity1 и activity2 хранится в стеке. Когда пользователь нажимает «назад», или на activity3 вызывается метод finish(), создается и стартует activity2.

Этот механизм полезен для реализации роутинга при запуске приложения через deep link.

#Activity
Читать полностью
Является ли List в Kotlin immutable-коллекцией?

Immutable-объект – это объект, состояние которого невозможно изменить после создания.

List в Kotlin не имеет методов для изменения состояния (добавления и удаления элементов), поэтому может показаться что это immutable-коллекция.

На самом деле List – это интерфейс, имеющий read-only доступ. Такой паттерн называется Immutable Interface. За этим интерфейсом может скрываться любая коллекция, например мутабельный ArrayList (пример на картинке).

Ранее мы писали как создать immutable-коллекцию в Java.

#Kotlin
Читать полностью
Как реализован оператор subscribeOn в RxJava2?

Ранее мы писали, что subscribeOn() задает поток, на котором происходит подписка, и имеет эффект от создания Observable и вниз по цепочке вызовов RxJava до первого observeOn().
Это поведение обусловлено реализацией оператора subscribeOn():

1. При вызове Observable.subscribeOn() создается объект класса ObservableSubscribeOn, который является наследником Observable и выступает в качестве враппера для оригинального observable.

2. Когда на observable вызывается метод subscribe(), вызов делегируется в абстрактный метод subscribeActual() класса Observable, который реализован в ObservableSubscribeOn.

3. В методе subscribeActual() вызывается scheduleDirect() на объекте типа Scheduler, который был передан аргументом в оператор subscribeOn().
Параметром метода scheduleDirect() передается Runnable, в котором вызывается source.subscribe(), где source – это оригинальный Observable.

Из такой реализации следует, что все что делает subscribeOn() – это создание класса-враппера, который делегирует вызов subscribe() на оригинальный Observable, со сменой треда на переданный шедулер.

#RxJava
Читать полностью
Назовите основные MotionEvent Actions

Наиболее частые actions:

• ACTION_DOWN – это первый action, который доставляется в таргет-view, когда пользователь дотрагивается до экрана. Чтобы получить последующие actions, таргет-view должна вернуть true в методе onTouchEvent(). Это значит, что таргет-view заинтересована в обработке ивента. Если вернуть false из onTouchEvent() для ACTION_DOWN, то ивент пойдет на обработку вверх по иерархии, а последующие ивенты не будут доставляться в таргет-view.

• ACTION_MOVE – ивенты с этим action происходят, когда пользователь перемещает палец на экране. ACTION_MOVE ивенты будут доставляться только во view, которая вернула true из onTouchEvent() для ACTION_DOWN.

• ACTION_UP – последний action в серии тач ивентов. Он также доставляется только во view, которая начала обработку.

• ACTION_CANCEL – показывает, что текущий ивент был отменен. Ивенты с ACTION_CANCEL доставляются в таргет-view, если один из родительских ViewGroup перехватил ивент в методе onInterceptTouchEvent().

#View
Читать полностью
Как Touch Event доставляется до таргет-view?

Touch event в Андроиде проходит круг по иерархии view, пока одна из view не обработает его (см. картинку).

Первый класс, который получает touch event – это Activity. Путь от activity вниз по иерархии оповещает ViewGroup на каждом уровне. После достижения таргет-view ивент идет вверх по иерархии. На этом пути каждая из ViewGroup может обработать ивент. Когда ивент обработан таргет-view или одной из ViewGroup, он больше не доставляется на обработку следующим ViewGroup.

Реализовано это поведение следующим образом:

1. Сначала вызывается Activity.dispatchTouchEvent(). Этот метод делегирует вызов в decor view.

2. Ивент идет вниз по иерархии ViewGroup, начиная от decor view.

3. На каждом уровне вызывается метод ViewGroup.dispatchTouchEvent(), который проверяет результат вызова onInterceptTouchEvent() в текущей ViewGroup.

4. Если onInterceptTouchEvent() возвращает true, то происходит короткое замыкание. Ивент перестает спускаться по иерархии и текущая ViewGroup получает возможность первой обработать ивент. Если ViewGroup не обрабатывает ивент, то он поднимается по иерархии.

5. Если onInterceptTouchEvent() возвращает false, то ивент спускается на следующий уровень, пока не доходит до таргет-view.

6. На таргет-view вызывается метод dispatchTouchEvent(), который вызывает OnTouchListener.onTouch(), если листенер задан. Если ивент не обработан листенером, то вызывается View.onTouchEvent().

7. Если таргет-view не обработала ивент, то он поднимается по иерархии, пока не будет обработан или пока не достигнет activity.

ViewGroup – наследник класса View, поэтому обработка ивента на шаге 4 реализована также, как на шаге 6. Т.е. сначала вызывается OnTouchListener.onTouch(), затем ViewGroup.onTouchEvent().

#View
Читать полностью
Для чего нужен метод onInterceptTouchEvent()?

Метод ViewGroup.onInterceptTouchEvent(e: MotionEvent) позволяет перехватить ивент во ViewGroup и не отправлять его вниз по иерархии в таргет-view.

Значение, возвращаемое методом onInterceptTouchEvent(), проверяется в dispatchTouchEvent().

Если onInterceptTouchEvent() возвращает false, то dispatchTouchEvent() ищет дочернюю view для обработки ивента и передает ивент вниз по иерархии.

Если onInterceptTouchEvent() возвращает true, то ивент передается на обработку текущей ViewGroup в метод onTouchEvent(). При этом ивент все также передается по иерархии до таргет-view, но MotionEvent.getAction() будет иметь значение ACTION_CANCEL.

#View
Читать полностью
Как работает метод dispatchTouchEvent()? (2/2)

Decor View – это верхний ViewGroup в иерархии view, ассоциированной с Window.

В классе ViewGroup метод dispatchTouchEvent() переопределен и имеет отличную реализацию от класса View, поэтому рассмотрим их отдельно.

ViewGroup.dispatchTouchEvent() определяет, следует ли отправить ивент в одну из дочерних view или обработать в текущей ViewGroup:

1. Сначала вызывается метод onInterceptTouchEvent(). Если этот метод возвращает false, то ивент пробрасывается вниз по иерархии view, иначе ViewGroup обрабатывает ивент сама;

2. Проверяются координаты каждой дочерней view и координаты объекта MotionEvent. Если MotionEvent входит в границы дочерней view, то на ней вызывается метод dispatchTouchEvent() и объект MotionEvent переходит вниз по иерархии;

3 Если ни одна из дочерних view не подходит для передачи ивента, то текущая ViewGroup считается таргет-view и обрабатывает ивент.


View.dispatchTouchEvent() вызывается только в том случае, когда текущая view уже определена как таргет-view ивента. Этот метод делает следующее:

1. Если view имеет OnTouchListener, то вызывается OnTouchListener.onTouch() с объектом MotionEvent в качестве параметра;

2. Если ивент не обработан листенером, то вызывается метод View.onTouchEvent().

#View
Читать полностью
Как работает метод dispatchTouchEvent()? (1/2)

В Андроиде метод dispatchTouchEvent(event: MotionEvent) с одинаковой сигнатурой есть в двух классах: Activity и View. Этот метод помогает доставить объект MotionEvent до View, которой он предназначен.

Когда пользователь дотрагивается до экрана в области запущенного приложения, система доставляет объект MotionEvent в активити. Вызывается метод Activity.dispatchTouchEvent().

Activity.dispatchTouchEvent() делегирует вызов в класс Window, на котором вызывается superDispatchTouchEvent(). Window, в свою очередь, вызывает dispatchTouchEvent() на decor view, которая является первой view в иерархии, связанной с Window.

#View
Читать полностью
Полный курс для разработчиков Android: от начинающих до продвинутых!

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

Вот все, чему вы научитесь в этом полном курсе:
✔️ Как создавать приложения для Android с нуля.
✔️ Как использовать Java для создания приложений для Android.
✔️ Какие инструменты необходимы для разработки приложений для Android.
✔️ Как создать пользовательский интерфейс для приложения, используя несколько виджетов.
✔️ Как можно добавить свойства к виджетам.

Студенты программы получат доступ на 2 месяца бесплатного изучения английского языка для ІТ специалистов от онлайн-школы EnglishDom.

Успейте записаться, первым 20 студентам — скидка 30%! Хотите больше информации? Переходите по ссылке: https://clc.to/VygWmg
Читать полностью
Что такое Window?

Window – это абстрактный класс, который не является наследником Activity, Fragment или View. Класс Window контролирует что и как рисуется на экране.

Активити имеет один инстанс Window, который можно получить методом getWindow(). Window, в свою очередь, имеет объект Surface и единственную иерархию View.

Android-приложение использует WindowManager для создания объектов типа Window и Surface, на котором рисуется контент Window.

Когда UI должен обновиться, на объекте Surface вызывается метод lockCanvas(), который возвращает объект типа Canvas. Canvas передается вниз по иерархии View, ассоциированной с Window, и каждая view рисует себя на канвасе.

#View
Читать полностью
Репозиторий с полезными материалами для подготовки к собеседованиям
#пятница

https://github.com/jwasham/coding-interview-university
В чем разница между flatMap(), concatMap() и switchMap() в RxJava?

flatMap() разделяет rx-стрим на несколько промежуточных стримов, назовем их [A, B, C], и затем соединяет результат в один стрим. Элементы промежуточных стримов передаются напрямую в конечный стрим без гарантии сохранения порядка, в котором созданы A, B и C. Конечный результат может быть таким: [C1, A1, A2, B1, C2, A3, B2, B3, C3].

concatMap() работает похожим на flatMap() образом, но сохраняет порядок промежуточных стримов. Результат будет: [A1, A2, A3, B1, B2, B3, C1, C2, C3].

switchMap() похож на flatMap() и также как concatMap() сохраняет порядок. Но при использовании switchMap() каждый предыдущий промежуточный стрим останавливается в тот момент, когда стартует следующий. Результат может выглядеть так: [A1, A2, B1 C1, C2, C3].

Подробнее

#RxJava
Читать полностью