# Тест перед собеседованием в "Зеленую компанию с галочкой"
## 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 Ответ

:::
#### Выберите верный ЖЦ Activity
:::spoiler Ответ

:::
#### Выберите жизненный цикл привязанного (bounded) Service
:::spoiler Ответ

:::
#### Выберите жизненный цикл стартованного (started) Service
:::spoiler Ответ

:::
#### В каком 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")
}
```