# Тест перед собеседованием в "Зеленую компанию с галочкой" ## RxJava #### Задача: необходимо выполнить некоторый метод, который в случае успеха ничего не возвращает (void), а в случае ошибки бросает исключение. (Пример: writeEntityToFile(File, Entity) throws IOException). С помощью какого реактивного класса это нужно сделать? - Observable\<Void> - Maybe\<Void> - Completable - Flowable\<Void> - Single\<Void> :::spoiler Ответ RxJava 3 features several base classes you can discover operators on: ```io.reactivex.rxjava3.core.Flowable: 0..N flows```, supporting Reactive-Streams and backpressure ```io.reactivex.rxjava3.core.Observable```: 0..N flows, no backpressure, ```io.reactivex.rxjava3.core.Single```: a flow of exactly 1 item or an error, ```io.reactivex.rxjava3.core.Completable```: a flow without items but only a completion or error signal, ```io.reactivex.rxjava3.core.Maybe```: a flow with no items, exactly one item or an error. Из описания потоков видно, что правильный ответ **Completable** ::: #### Следующий код вызывается из UI-потока: ```java Single.just("Some string") // строка 1 .map(str -> str.length()) // строка 2 .subscribeOn(Schedulers.io()) // строка 3 .map(length -> 42*length) // строка 4 .subscribe(number -> Log.i("Sample", "number = " + number))// строка 5 ``` На каких Scheduler-ах будут исполняться функции, определённые на строках 2 и 4? ## Core Java #### Выберите все требования к переопределению equals() (Several Answers) - рефлективность (a.equals(a)) - транзитивность (если a.equals(b) и b.equals(c), то a.equals(c)) - симметричность (если a.equals(b), то b.equals(a)) - проверка на null (a.equals(null) == false) - проверка на равенство hashCode() #### Пусть некоторый класс SomeSerializableEntity реализует интерфейс java.io.Serializable. В классе объявленно поле с несериализуемым типом SomeActivity (делать его сериализуемым нельзя). Как обеспечить сериализацию SomeSerializableEntity без исключений NotSerializableException? - Перепроектировать сериализуемую сущность, исключить из неё несериализуемые поля в принципе. - Отметить несериализуемое поле квалификатором transient - Отметить несериализуемое поле квалификатором volatile #### Имеется класс, в котором перегружены методы equals() и hashCode() с соблюдением контракта при перегрузке этих методов. Какие утверждения верны? (Several answers) - Из равенства hashCode() 2 экземпляров класса всегда следует из равенство по equals() - Из равенства по equals() 2 экземпляров класса всегда следует из равенство по hashCode() #### Выберите все корректные способы чтения из потока. Примечания по коду: - initSourceSomeWay() throws IOException - метод, инициализирующий источник данных тем или иным способом. - makeSomeWorkOnSource() throws IOException - метод, выполняющий некоторую работу над источником даннх. :::spoiler Варианты ```java public void example() throws IOException { InputStream source = initSourceSomeWay(); makeSomeWorkOnSource(source); source.close(); } ``` ```java public void example() throws IOException{ InputStream source = null; try { source = initSourceSomeWay(); makeSomeWorkOnSource(source); } finally { try { if (source != null) { source.close(); } } catch (IOException ex) {} } } ``` ```java public void example() throws IOException { try (InputStream source = initSourceSomeWay()) { makeSomeWorkOnSource(source); } } ``` ```java public void example() throws IOException { InputStream source = null; try { source = initSourceSomeWay(); makeSomeWorkOnSource(source); } finally { source.close() } } ``` ::: ## Java Threadings #### Как работает Future.get() todo - Future.get() немедленно возвратит актуальный результат (в том числе, null для случая, когда команда не выполнилась до конца или аварийно завершилась) - 1. Если команда (Callable / Runnable) не завершилась (в том числе, аварийно, через Exception), то Future.get() немедленно возвратит null. 2. Если команда... #### Задача: в побочном треде завершилась некоторая операция, необходимо направить событие об этом в главный поток. Выберите все кореектные варианты решения. (Several answers) todo ```java public void methodThatWorkOnMainThread(SomeCallback callback){ } ``` ## ViewModel #### Есть класс SomeViewModel, наследуемый непосредственно от ViewModel. Возникнут ли какие-то ошибки, если мы в SomeViewModel объявим конструктор с параметрами? - При пересоздании Activity или Fragment при смене конфигурации выбросится RuntimeException - Нет, ошибок не будет - Код не скомпилируется - При попытке создания ViewModel выбросится RuntimeException #### Как Activity и Fragment могут подписаться на изменения данных во ViewModel? (Several answers) - ViewModel держит ссылку на Activity или Fragment, при изменении данных уведомляет Activity или View об этом - ViewModel представляет getter-ы к LiveData, Activity и Fragment на него подписываются (отписываться явным образом необязательно) - ViewModel представляет getter-ы к LiveData, Activity и Fragment на него подписываются (отписываться явным образом обязательно) ## Core Android #### Выберите верный ЖЦ Fragment :::spoiler Ответ ![](https://i.imgur.com/5wNVTFD.png) ::: #### Выберите верный ЖЦ Activity :::spoiler Ответ ![](https://i.imgur.com/MBYh6wz.png) ::: #### Выберите жизненный цикл привязанного (bounded) Service :::spoiler Ответ ![](https://i.imgur.com/7bs16mH.png) ::: #### Выберите жизненный цикл стартованного (started) Service :::spoiler Ответ ![](https://i.imgur.com/9w6ImrF.png) ::: #### В каком callback-е View происходит расчет его размеров с учетом: - ограничений, налагаемых на него родительким ViewGroup; - требований и пожеланий, идущим от составляющих View элементов (drawablе) и собственных параметров (padding)? #### Чем отличается View.GONE от View.INVISIBLE? #### Как при создании фрагмента следует передать ему данные, чтобы они корректно подхватывались при пересоздании фрагмента - Передать данные в конструктор фрагмента - Записать (с учетом ограничений на тип данных) данные в Bundle, проставить его через setArguments(Bundle) на создаваемый фрагмент - Проставить данные через set-методы фрагмента #### Задача: в ActivityA есть кнопка "Выбрать песню". ActivityB представляет собой список песен. Необходимо из ActivityA по нажатию на кнопку запустить ActivityB, выбрать песню и данные о ней отобразить в ActivityA. При пересоздании процесса приложения ActivityA должно отобразить песню, выбранную до убийства процесса (_очень важное требование_). Как это сделать? (Several answers) - Запустить ActivityB с помощью startActivityForResult(); - В ActivityB поставить выбранную песню в интент с помощью setResult(); - В ActivityB.onActivityResult() обработать полученный результат - Объявить синглтон; - Проставить в него выбранную песню; - В ActivityA.onResume() считать данные - Объявить в ActivityA public static Song song; - При выборе песни в ActivityB поставить её в объявленную статическую переменную; - В ActivityA.onResume() считать данные - Объявить в подклассе Application private Song song; написать к нему геттеры и сеттеры; - При выборе песни в ActivityB проставить её в объявленное поле Application; - В ActivityA.onResume() считать данные - Android-компоненты не допускают подобное поведение вследствие своей высокой изолированности; необходимо вернуть задачу менеджеру на проработку #### Дано: пришёл некоторый broadcast, следует загрузить некоторую информацию (гарантирутеся, что загрузка выполнится не более чем за 2 секунды) и показать Notification. Дополнительное требование: не должно возникать "подвисания" приложения (пропуска кадров отрисовки) в ходе работы BroadcastReceiver. Какие из перечисленных вариантов допустимы? (Several answers) todo - В BroadcastReceiver.onReceive() вызвать метод goAsync(), выданный токен передать в команду на #### Выберите способы регистрации BroadcastReceiver (Several answers) - Создать BroadcastReceiver, создать и сконфигурировать IntentFilter; Зарегистрировать, используя метод registerReceiver() - последний метод доступен только в Application - Создать BroadcastReceiver, создать и сконфигурировать IntentFilter; Зарегистрировать, используя метод registerReceiver() - последний метод доступен только в Activity - Создать BroadcastReceiver, создать и сконфигурировать IntentFilter; Зарегистрировать, используя метод registerReceiver() - последний метод доступен только в наследнике Context - Указать BroadcastReceiver в AndroidManifest.xml #### Что произойдёт, если в методе onCreateView() у фрагмента вернуть null? - Произойдет падение в runtime-e - Фрагмент будет без UI, у него будут вызываться методы жизненного цикла, что и у фрагмента с UI - Код не скомпилируется #### Из ActivityA запускается ActivityB с полупрозрачной темой. Какие коллбэки вызовутся у ActivityA? (Several answers) - onCreateDialog() - onDestroy() - onPause() - onStop() #### Что будет после вызова finish() у активити, находящемся на переднем плане? - Будет вызван только onDestroy() и компонент будет уничтожен - Будут вызваны методы жизненного цикла: onStop(), onDestroy() и компонент будет уничтожен - Будут вызваны методы жизненного цикла: onPause(), onStop(), onDestroy() и компонент будет уничтожен - Компонент сразу будет уничтожен без вызова методов жизненного цикла, так как это принудительное завершение работы компонента #### Задача: необходимо написать кастомную View - EllipseView, внутри которой рисуется эллипс с заданным цветом. Метод setEllipseColor() проставляет цвет эллипса. Какой метод необходимо и достаточно вызвать внутри setEllipseColor() для того, чтобы на следующем кадре эллип применил изменения в цвете? #### Как остановить работающий (started) Service? (Several answers) - Вызвать у любого валидного контекста stopService(), передав в него Intent с информацией о сервисе - Вызвать у сервиса метод stopSelf() - Остановить работающий сервис программными средствами невозможно, его может остановить только система - Вызвать у сервиса метод stopForeground() #### В каком потоке и процессе работает BroadcastReceiver? - Фоновой поток, новый дополнительный процесс приложения - Фоновой поток, текущий процесс приложения - Главный поток, текущий процесс приложения - Главный поток, новый дополнительный процесс приложения ## Coroutines #### В каком порядке выведутся сообщения при выполнении кода, приведенного ниже? ```kotlin fun main() = runBlocking{ launch{ delay(200L) println("Hello 1") } coroutineScope { launch { delay(500L) println("Hello 2") } delay(100L) println("Hello 3") } println("Hello 4") } ```