Kotlin | Вопросы собесов
2.57K subscribers
28 photos
963 links
Download Telegram
Какие есть методы жизненного цикла Activity и как они отрабатывают ?
Спросят с вероятностью 60%

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

Основные методы жизненного цикла:

1️⃣`onCreate(Bundle savedInstanceState)`
Этот метод вызывается при первом создании Activity. Здесь вы должны выполнить все начальную настройку — например, создать пользовательский интерфейс, инициализировать некоторые данные класса. Это место для всего, что должно произойти один раз за время жизни.
Пример: setContentView(R.layout.activity_main); устанавливает разметку пользовательского интерфейса для Activity.

2️⃣`onStart()`
Вызывается, когда Activity становится видимым для пользователя. Это следует за onCreate() (если он запускается впервые) или onRestart() (если он возвращается к взаимодействию с пользователем после его остановки).

3️⃣`onResume()`
Вызывается непосредственно перед тем, как Activity начинает взаимодействовать с пользователем. В этот момент он находится на переднем плане (на экране). Это последний метод, который вызывается перед тем, как он начнет получать ввод данных от пользователя.

4️⃣`onPause()`
Вызывается, когда система собирается продолжить или возобновить другую Activity. Этот метод используется для остановки динамических элементов, которые могли быть запущены во время onResume() или для освобождения ресурсов, которые могут быть нужны другим.

5️⃣`onStop()`
Вызывается, когда Activity больше не видимо пользователю, потому что другое Activity было возобновлено и покрыло его. Это может быть использовано для выполнения более "тяжеловесной" очистки ресурсов.

6️⃣`onRestart()`
Вызывается после того, как Activity было остановлено, но снова начинает запускаться для взаимодействия с пользователем. onRestart() восстанавливает его состояние в том виде, в каком оно было перед тем, как было остановлено.

7️⃣`onDestroy()`
Этот метод вызывается перед уничтожением Activity. Это последний вызов, который он получает. Здесь можно освободить все ресурсы, которые не были освобождены автоматически системой.

Как они отрабатывают

Жизненный цикл начинается с вызова onCreate() и проходит через серию стадий, включая onStart(), onResume(), onPause(), onStop(), и, в конечном итоге, onDestroy(). В какой-то момент, если Activity останавливается, но позже должно быть восстановлено, вызывается onRestart(), за которым следуют onStart() и onResume(). Важно понимать, что каждый метод предназначен для определенной стадии жизни Activity и предоставляет возможность для выполнения соответствующих действий, таких как инициализация, пауза, восстановление и очистка ресурсов.

Методы жизненного цикла Activity — это специальные функции, которые вызываются системой в определенные моменты жизни Activity, чтобы разработчики могли правильно управлять ресурсами и интерфейсом пользователя. Они обеспечивают плавное создание, видимость, взаимодействие, паузу и уничтожение Activity.

👉 Можно посмотреть примеры как отвечают люди на этот вопрос, или перейти к списку 1078 вопросов на Android разработчика. Ставь 👍 если нравится контент

🔐 База собесов | 🔐 База тестовых
👍283🔥1🎉1
Для чего нужен data class ?
Спросят с вероятностью 60%

Классы данных (data class) предназначены для хранения данных. Основная их задача — упростить создание классов, которые будут использоваться преимущественно для хранения данных, не добавляя при этом лишнего шаблонного кода. Чтобы определить класс данных, достаточно добавить ключевое слово data перед объявлением класса.

Особенности и преимущества:

1️⃣Автоматическая генерация функций:
equals()/hashCode(): Для сравнения объектов по содержимому, а не по ссылкам.
toString(): Для представления объекта в виде строки в удобочитаемом формате.
componentN(): Для деструктуризации объекта на его составные части.
copy(): Для создания копии объекта с возможностью изменять некоторые свойства.

Зачем это нужно?

Его использование позволяет существенно сократить количество шаблонного кода, который разработчикам приходится писать для классов, предназначенных для хранения данных. Это упрощает создание моделей данных и повышает читабельность кода, делая его более компактным и понятным.

Пример:
data class User(val name: String, val age: Int)


В этом примере определен класс данных User с двумя свойствами: name и age. Kotlin автоматически сгенерирует для этого класса методы equals(), hashCode(), toString(), компонентные функции для каждого свойства и метод copy().

Без использования data class, пришлось бы вручную реализовать все эти методы, что ведет к увеличению объема кода и его сложности.

Data class используются для упрощения создания классов, предназначенных для хранения данных. Они автоматически генерируют необходимые методы, что позволяет сделать код более чистым, удобным для чтения и поддержки. Это идеальное решение для моделей данных, где основная цель класса — это хранение данных.

👉 Можно посмотреть примеры как отвечают люди на этот вопрос, или перейти к списку 1078 вопросов на Android разработчика. Ставь 👍 если нравится контент

🔐 База собесов | 🔐 База тестовых
👍114🔥1
Какие основные компоненты Аndroid-приложения ?
Спросят с вероятностью 53%

Основные компоненты Android-приложения включают Activity, Services, Broadcast Receivers и Content Providers. Эти компоненты обеспечивают основную функциональность приложения, позволяя ему взаимодействовать с пользователем, выполнять задачи в фоновом режиме, реагировать на системные или приложенческие события и управлять данными.

1️⃣Activity представляет собой один экран с пользовательским интерфейсом. Каждая активность предназначена для выполнения одной конкретной задачи (например, выбора фотографии из галереи или отправки сообщения). Пользователь взаимодействует с приложением в основном через активности.

2️⃣Services — это компоненты, которые выполняют длительные или фоновые операции без предоставления пользовательского интерфейса. Например, сервис может воспроизводить музыку в фоне, когда пользователь находится в другом приложении, или синхронизировать данные в фоновом режиме.

3️⃣Broadcast Receivers предназначены для прослушивания и реагирования на широковещательные сообщения от других приложений или системы. Например, приложение может запускать определенные действия или уведомления в ответ на сообщения о низком заряде батареи или загрузке новой фотографии.

4️⃣Content Providers позволяют приложениям хранить и делиться данными. Через них можно осуществлять доступ к данным внутри одного приложения из других приложений, а также управлять доступом к этим данным. Примером может служить доступ к контактам или медиафайлам на устройстве.

Каждый из этих компонентов играет свою роль в создании целостного и функционального Android-приложения. Они могут взаимодействовать друг с другом через явные или неявные намерения (Intents), предоставляя разнообразные способы выполнения задач и обмена данными.

Основные компоненты Android-приложения — это строительные блоки, которые позволяют создавать разнообразные пользовательские интерфейсы, выполнять задачи в фоне, реагировать на события и управлять данными. Эти компоненты включают Activity, Services, Broadcast Receivers и Content Providers.

👉 Можно посмотреть примеры как отвечают люди на этот вопрос, или перейти к списку 1078 вопросов на Android разработчика. Ставь 👍 если нравится контент

🔐 База собесов | 🔐 База тестовых
👍9🔥32
В чем преимущество Kotlin для разработки под android ?
Спросят с вероятностью 47%

Kotlin, язык программирования, разработанный JetBrains, представляет собой статически типизированный язык, который полностью совместим с Java и специально оптимизирован для разработки под Android. Преимущества в контексте разработки Android-приложений многочисленны и значительны:

1️⃣Более краткий и выразительный синтаксис: Kotlin позволяет писать код более кратко и чисто по сравнению с Java, сокращая количество шаблонного кода. Это делает код легче для чтения и поддержки.

2️⃣Null безопасность: В Kotlin встроена поддержка обработки значений null, что помогает избежать NullPointerException - одной из наиболее распространенных ошибок в Java-приложениях.

3️⃣Расширенные функции (Extension functions): Kotlin позволяет добавлять новые функции к существующим классам без их модификации. Это упрощает работу с API Android, делая код более читабельным и лаконичным.

4️⃣Поддержка функционального программирования: Kotlin включает множество функций функционального программирования, таких как лямбда-выражения, высшие порядки функций, которые делают код более гибким и выразительным.

5️⃣Полная совместимость с Java: Kotlin полностью совместим с Java, что позволяет легко использовать все существующие Java-библиотеки и фреймворки в Kotlin-проектах, а также постепенно переводить существующий Java-код на Kotlin.

6️⃣Инструментальная поддержка: Kotlin полностью поддерживается в Android Studio, что обеспечивает удобные инструменты для разработки, такие как автодополнение, рефакторинг кода, проверка ошибок в реальном времени.

7️⃣Корутины для асинхронного программирования: Kotlin предоставляет встроенную поддержку корутин, что упрощает работу с асинхронными операциями, такими как выполнение сетевых запросов или чтение из базы данных, делая код более понятным и менее подверженным ошибкам.

8️⃣Улучшенная безопасность: Благодаря более строгой системе типов и обработке исключений, Kotlin помогает предотвратить распространенные ошибки во время компиляции, что повышает общую безопасность приложения.

9️⃣Официальная поддержка Google: С 2017 года Kotlin является официальным языком для разработки Android-приложений, что гарантирует его постоянное обновление и поддержку со стороны Google.

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

👉 Можно посмотреть примеры как отвечают люди на этот вопрос, или перейти к списку 1078 вопросов на Android разработчика. Ставь 👍 если нравится контент

🔐 База собесов | 🔐 База тестовых
👍61🔥1
Что является сущностью корутин контекста ?
Спросят с веротяностью 13%

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

Основные элементы:

1️⃣Job: Управляет жизненным циклом корутины. Позволяет отменять корутину и её дочерние корутины, а также отслеживать их состояние.

2️⃣Dispatcher: Определяет, на каком потоке или потоках будет выполняться корутина. Dispatchers.Main, Dispatchers.IO, и Dispatchers.Default — примеры диспетчеров, которые позволяют корутине выполняться на главном потоке UI, на фоновом потоке для операций ввода-вывода и на потоке для вычислений соответственно.

3️⃣CoroutineExceptionHandler: Обработчик исключений для корутин. Позволяет централизованно обрабатывать неперехваченные исключения, возникающие во время выполнения корутины.

4️⃣CoroutineName: Используется для установки имени корутины, что может упростить отладку, позволяя идентифицировать корутину в логах и отладочной информации.

Является агрегатом этих и потенциально других элементов, каждый из которых может быть добавлен, удалён или изменён с использованием плюс-оператора (+). Контекст корутины передаётся как параметр при запуске новой корутины и может быть изменён для каждой корутины индивидуально.

Пример:
import kotlinx.coroutines.*

fun main() = runBlocking {
val myJob = Job()
val myDispatcher = Dispatchers.Default
val myExceptionHandler = CoroutineExceptionHandler { _, exception ->
println("Caught $exception")
}

val coroutineContext = myJob + myDispatcher + myExceptionHandler + CoroutineName("MyCoroutine")

val coroutine = launch(coroutineContext) {
println("Running in ${coroutineContext[CoroutineName.Key]}")
throw IllegalStateException()
}

coroutine.join()
}


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

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

👉 Можно посмотреть примеры как отвечают люди на этот вопрос, или перейти к списку 1078 вопросов на Android разработчика. Ставь 👍 если нравится контент
👍7🔥3
В чем отличие между job и supervisor job ?
Спросят с веротяностью 13%

Job и SupervisorJob являются ключевыми понятиями, связанными с управлением жизненным циклом сопрограмм (корутин). Хотя оба они используются для контроля за корутинами, между ними есть существенные различия в поведении, особенно когда речь идет о обработке исключений.

Job

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

SupervisorJob

Работает аналогично Job, но с ключевым отличием в обработке исключений. SupervisorJob позволяет дочерним корутинам завершаться независимо, так что сбой в одной корутине не приведет к отмене и завершению всей иерархии корутин. Это особенно полезно в сценариях, где корутины выполняют взаимосвязанные, но относительно независимые задачи, и не требуется, чтобы ошибка в одной из них влияла на остальные. SupervisorJob гарантирует, что исключения в дочерних корутинах не распространяются вверх по иерархии, что позволяет обрабатывать их индивидуально.

Ключевые отличия

1️⃣Обработка исключений: Основное различие между Job и SupervisorJob заключается в способе обработки исключений. В Job исключение в любой из дочерних корутин приводит к отмене всей иерархии задач. В SupervisorJob исключения изолированы в пределах корутины, в которой они произошли, позволяя другим корутинам продолжать свое выполнение.

2️⃣Использование: Job подходит для задач, где необходимо, чтобы все дочерние корутины были отменены при возникновении ошибки в любой из них. SupervisorJob используется, когда задачи независимы друг от друга, и необходимо, чтобы ошибка в одной из них не влияла на остальные.

3️⃣Применение: SupervisorJob часто применяется в UI-приложениях, где различные операции, такие как загрузка данных или анимации, должны быть независимыми, и сбой в одной операции не должен прерывать всю работу приложения.

Выбор между Job и SupervisorJob зависит от конкретных требований к обработке исключений и отмене задач в вашем приложении.

👉 Можно посмотреть примеры как отвечают люди на этот вопрос, или перейти к списку 1078 вопросов на Android разработчика. Ставь 👍 если нравится контент
👍5🔥4
Чем array отличается от list ?
Спросят с веротяностью 13%

Массивы (Array) и списки (List) представляют собой структуры данных для хранения наборов элементов. Хотя они могут казаться похожими на первый взгляд, между ними есть ключевые различия, касающиеся их использования, функциональности и гибкости.

Основные различия:

1️⃣Размер:
Array: Имеет фиксированный размер. Это означает, что после его создания вы не можете изменить его размер (добавить или удалить элементы).
List: В большинстве языков программирования, включая Java и Kotlin, списки являются динамическими. Это означает, что вы можете добавлять, удалять и изменять элементы списка после его создания, и размер списка будет автоматически адаптироваться.

2️⃣Типизация:
Array: В Java массивы могут быть как примитивных типов, так и объектных. В Kotlin массивы всегда объектные, но есть специальные типы для представления массивов примитивов (например, IntArray, ByteArray).
List: Является частью коллекций и всегда содержит объекты. В Java и Kotlin списки обобщены, что позволяет указывать тип хранимых элементов.

3️⃣Функциональность и удобство использования:

Array: Базовые операции, такие как доступ к элементу по индексу, работают очень быстро, но функциональность ограничена базовыми операциями.
List: Предоставляет богатый набор методов для работы с элементами, включая поиск, сортировку, вставку и удаление. Благодаря этому списки гораздо удобнее в использовании для сложных операций.

4️⃣Производительность:
Array: Быстрее, особенно для операций с низким уровнем, таких как непосредственный доступ к элементам по индексу.
List: Может быть менее эффективен из-за дополнительной обертки и динамического изменения размера, но предоставляет больше удобств для управления коллекциями элементов.

5️⃣Примеры:

Array:
    int[] myArray = new int[10];
myArray[0] = 1;


List:
    List<Integer> myList = new ArrayList<>();
myList.add(1);


Array:
    val myArray = arrayOf(1, 2, 3)


List:
    val myList = listOf(1, 2, 3)


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

👉 Можно посмотреть примеры как отвечают люди на этот вопрос, или перейти к списку 1078 вопросов на Android разработчика. Ставь 👍 если нравится контент
👍8🔥21
Зачем нужны методы equals и hashcode ?
Спросят с веротяностью 20%

Методы equals() и hashCode() играют центральную роль в сравнении объектов и управлении ими в коллекциях. Важность этих методов обусловлена тем, как Java обрабатывает объекты и как определенные структуры данных, такие как HashSet, HashMap, Hashtable и HashMap, используют их для оптимизации работы с данными.

Метод equals(Object obj)

Определяет, равен ли текущий объект другому объекту. По умолчанию, метод equals() в классе Object сравнивает ссылки на объекты, то есть проверяет, указывают ли две ссылки на один и тот же объект в памяти. Однако часто требуется сравнивать объекты по содержимому, а не по их адресам в памяти. В этом случае метод equals() нужно переопределить таким образом, чтобы он отражал логику равенства для данного класса.

Пример:
@Override
public boolean equals(Object obj) {
if (this == obj) return true;
if (obj == null || getClass() != obj.getClass()) return false;
MyObject myObject = (MyObject) obj;
return field.equals(myObject.field);
}

Метод hashCode()

Возвращает хеш-код объекта, который используется хеш-таблицами для определения места хранения объекта. В Java, хеш-код представляет собой целочисленное значение, связанное с содержимым объекта. Согласно контракту Java, если два объекта равны согласно методу equals(), то их хеш-коды также должны быть равны. Это необходимо для корректной работы объектов в качестве ключей в хеш-таблицах.

Пример:
@Override
public int hashCode() {
return Objects.hash(field);
}


Соблюдение контракта между equals() и hashCode() критически важно для правильной работы коллекций, основанных на хеш-таблицах, таких как HashSet и HashMap. Если два объекта считаются равными по методу equals(), но имеют разные хеш-коды, это может привести к тому, что один и тот же объект будет добавлен в коллекцию дважды. Аналогично, если два объекта имеют одинаковый хеш-код, но не равны по equals(), это может ухудшить производительность хеш-таблиц за счет увеличения коллизий.

Методы equals() и hashCode() обеспечивают основу для сравнения и управления объектами в Java, позволяя разработчикам определять собственные правила равенства объектов и обеспечивая их корректную работу в коллекциях и других структурах данных.

👉 Можно посмотреть примеры как отвечают люди на этот вопрос, или перейти к списку 1078 вопросов на Android разработчика. Ставь 👍 если нравится контент

🔐 База собесов | 🔐 База тестовых
🔥4👍21🎉1