fa
Feedback
Kotlin | Вопросы собесов

Kotlin | Вопросы собесов

رفتن به کانال در Telegram

Сайт: https://easyoffer.ru/ Все каналы: t.me/+xGeAw6ckJ4liYzQy Контакт для рекламы: @easyoffer_adv

نمایش بیشتر
2 453
مشترکین
-524 ساعت
-97 روز
-1730 روز

در حال بارگیری داده...

جذب مشترکین
اوت '26
اوت '26
+25
در 0 کانال‌ها
ژوئیه '26
+27
در 0 کانال‌ها
Get PRO
ژوئن '26
+23
در 1 کانال‌ها
Get PRO
مه '26
+20
در 0 کانال‌ها
Get PRO
آوریل '26
+30
در 0 کانال‌ها
Get PRO
مارس '26
+32
در 0 کانال‌ها
Get PRO
فوریه '26
+46
در 0 کانال‌ها
Get PRO
ژانویه '26
+54
در 0 کانال‌ها
Get PRO
دسامبر '25
+23
در 0 کانال‌ها
Get PRO
نوامبر '25
+42
در 0 کانال‌ها
Get PRO
اکتبر '25
+38
در 0 کانال‌ها
Get PRO
سپتامبر '25
+44
در 0 کانال‌ها
Get PRO
اوت '25
+47
در 0 کانال‌ها
Get PRO
ژوئیه '25
+35
در 0 کانال‌ها
Get PRO
ژوئن '25
+46
در 0 کانال‌ها
Get PRO
مه '25
+55
در 0 کانال‌ها
Get PRO
آوریل '25
+57
در 0 کانال‌ها
Get PRO
مارس '25
+110
در 1 کانال‌ها
Get PRO
فوریه '25
+105
در 2 کانال‌ها
Get PRO
ژانویه '25
+159
در 53 کانال‌ها
Get PRO
دسامبر '24
+59
در 0 کانال‌ها
Get PRO
نوامبر '24
+70
در 0 کانال‌ها
Get PRO
اکتبر '24
+210
در 42 کانال‌ها
Get PRO
سپتامبر '24
+608
در 251 کانال‌ها
Get PRO
اوت '24
+147
در 0 کانال‌ها
Get PRO
ژوئیه '24
+203
در 54 کانال‌ها
Get PRO
ژوئن '24
+492
در 244 کانال‌ها
Get PRO
مه '24
+563
در 189 کانال‌ها
Get PRO
آوریل '24
+461
در 23 کانال‌ها
تاریخ
رشد مشترکین
اشارات
کانال‌ها
31 اوت0
30 اوت0
29 اوت0
28 اوت+3
27 اوت+1
26 اوت0
25 اوت+1
24 اوت+2
23 اوت+1
22 اوت0
21 اوت+1
20 اوت+1
19 اوت+1
18 اوت0
17 اوت+2
16 اوت+2
15 اوت0
14 اوت+2
13 اوت0
12 اوت0
11 اوت0
10 اوت+1
09 اوت0
08 اوت0
07 اوت+2
06 اوت0
05 اوت+1
04 اوت0
03 اوت+3
02 اوت0
01 اوت+1
پست‌های کانال
🔥 Осталось 3 дня! Пожизненный easyoffer PRO по цене одного года. Покупаешь один раз – пользуешься всю жизнь. Что входит в PRO: – Вопросы и задачи с реальных собеседований в конкретных компаниях – Лучшие ответы и видео-примеры от middle/senior специалистов – Записи реальных собеседований – Обход фильтров ATS с топ-30 ключевых слов в резюме – Автоотклики на hh – Тренажёры и симуляторы для идеальной подготовки к интервью ⏳ Акция действует только до 2 сентября 23:59 по МСК 👉 Забрать PRO со скидкой 70%: https://easyoffer.ru/pro

2
🤔 Какие знаешь особенности системы типов в Kotlin ? 🟠Null Safety (Безопасность null) Переменные по умолчанию не могут быть null, что предотвращает NullPointerException. var a: String = "abc" var b: String? = "abc" b = null // Допустимо 🟠Коллекции (Collections) Разделение на изменяемые и неизменяемые коллекции. val list: List<String> = listOf("a", "b", "c") // Неизменяемый список val mutableList: MutableList<String> = mutableListOf("a", "b", "c") // Изменяемый список 🟠Data Classes (Классы данных) Автоматическое создание методов equals(), hashCode(), и toString(). data class User(val name: String, val age: Int) 🟠Smart Casts (Умные приведения типов) Автоматическое приведение типа после проверки с помощью is. fun demo(x: Any) { if (x is String) { println(x.length) } } 🟠Sealed Classes (Запечатанные классы) Упрощают обработку ограниченных иерархий классов. sealed class Expr data class Const(val number: Double) : Expr() 🟠Выведение типов (Type Inference) Kotlin автоматически определяет тип переменной. val x = 10 // Int Ставь 👍 и забирай 📚 Базу знаний
91
3
Ты ищешь только по верхушке айсберга 🧊 Вбиваешь «Android разработчик» и думаешь, что видел всё. А под водой скрывается ещё 8
Ты ищешь только по верхушке айсберга 🧊 Вбиваешь «Android разработчик» и думаешь, что видел всё. А под водой скрывается ещё 80% вакансий, которые называются иначе: «мобильный разработчик», «Kotlin engineer», «SDK developer» и так далее. Рекрутеры не договариваются между собой о названиях. Поэтому те, кто ищут по одному запросу, просто сливают лучшие предложения. В свежем посте на канале я собрал полный список из 15 рабочих запросов для разных площадок + список самих площадок, где эти вакансии реально публикуют. Забирай список и перестань терять вакансии 👇 Android Оффер
133
4
🤔 Какая особенность у Data Class относительно других Kotlin Classes? Data Class автоматически генерирует equals, hashCode, toString, copy, и componentN функции. Они удобны для хранения данных и значительно упрощают работу с неизменяемыми структурами. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний
199
5
🤔 Расскажи о контрактах equals и hashCode Методы equals() и hashCode() используются для сравнения объектов и их корректной работы в коллекциях (Set, Map). 🚩Контракт `equals()` Метод equals() должен: Рефлексивность: a.equals(a) → true (объект равен самому себе). Симметричность: a.equals(b) == b.equals(a). Транзитивность: если a == b и b == c, то a == c. Согласованность: если a == b, то a.equals(b) всегда возвращает одно и то же, пока объект не изменится. Сравнение с null всегда даёт false: a.equals(null) == false. class User(val name: String, val age: Int) { override fun equals(other: Any?): Boolean { if (this === other) return true // Проверка на ссылочное равенство if (other !is User) return false // Проверка типа return name == other.name && age == other.age // Сравнение полей } } val user1 = User("Alice", 25) val user2 = User("Alice", 25) println(user1 == user2) // true (потому что переопределён equals) 🚩Контракт `hashCode()` Метод hashCode() должен: Согласованность с equals(): если a == b, то a.hashCode() == b.hashCode(). Но обратное не обязательно: два разных объекта могут иметь одинаковый hashCode(). Хеш-код не должен меняться, если объект не изменился. class User(val name: String, val age: Int) { override fun equals(other: Any?): Boolean { if (this === other) return true if (other !is User) return false return name == other.name && age == other.age } override fun hashCode(): Int { return name.hashCode() * 31 + age // 31 - стандартный коэффициент } } val userSet = HashSet<User>() userSet.add(User("Alice", 25)) println(userSet.contains(User("Alice", 25))) // true 🚩Автоматическая генерация в Kotlin Чтобы не писать equals() и hashCode() вручную, можно использовать data class: data class User(val name: String, val age: Int) data class автоматически создаёт equals(), hashCode(), а также copy() и toString(). val user1 = User("Alice", 25) val user2 = User("Alice", 25) println(user1 == user2) // true (equals) println(user1.hashCode() == user2.hashCode()) // true Ставь 👍 и забирай 📚 Базу знаний
210
6
🤔 Как работает async/await? async запускает асинхронную корутину, возвращающую Deferred, аналог Future. await приостанавливает выполнение до получения результата. Это позволяет параллельно выполнять задачи и синхронно работать с результатом. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний
249
7
🤔 View Model vs OnSavedInstanceState? ViewModel и onSaveInstanceState служат для сохранения данных при изменении конфигурации активности или фрагмента (например, при повороте экрана). Однако они решают эту задачу по-разному и имеют разные области применения. 🟠ViewModel ViewModel используется для хранения и управления данными, связанных с UI, таким образом, чтобы они сохранялись при изменении конфигурации (например, при повороте экрана). 🚩Как это работает? Когда система уничтожает и пересоздаёт Activity или Fragment, ViewModel остаётся в памяти до полного уничтожения владельца (например, выхода из Activity). class MyViewModel : ViewModel() { var counter: Int = 0 // Переменная, которая сохраняется при повороте экрана } Использование в Activity class MainActivity : AppCompatActivity() { private lateinit var viewModel: MyViewModel override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) viewModel = ViewModelProvider(this).get(MyViewModel::class.java) // Теперь viewModel.counter сохранится при повороте экрана } } 🚩Плюсы ➕Хранит данные в памяти до полного уничтожения Activity или Fragment. ➕Удобно для хранения сложных объектов списки, модели, API-данные ➕Позволяет разделять логику и UI улучшая архитектуру. 🚩Минусы ➖Данные исчезают при уничтожении Activity например, при закрытии приложения ➖Не сохраняет данные при завершении процесса например, при нехватке памяти 🚩onSaveInstanceState() Метод onSaveInstanceState() используется для сохранения данных в Bundle, который система автоматически передаёт при пересоздании Activity или Fragment. 🚩Как это работает? Когда Activity уничтожается (например, при повороте экрана), система вызывает onSaveInstanceState(), в котором можно сохранить небольшие данные (строки, числа и т. д.). После пересоздания Activity эти данные можно восстановить из savedInstanceState. class MainActivity : AppCompatActivity() { private var counter: Int = 0 // Значение, которое мы хотим сохранить override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) // Восстанавливаем данные, если они есть counter = savedInstanceState?.getInt("counter_key") ?: 0 } override fun onSaveInstanceState(outState: Bundle) { super.onSaveInstanceState(outState) outState.putInt("counter_key", counter) // Сохраняем значение перед уничтожением Activity } } 🚩Плюсы ➕Сохраняет данные даже при завершении процесса (например, при нехватке памяти). ➕Позволяет быстро восстановить состояние UI (например, текст в EditText). 🚩Минусы ➖Подходит только для небольших данных (числа, строки). ➖Не подходит для хранения сложных объектов (списки, большие модели, API-данные). ➖Требует кодирования и декодирования данных в Bundle Ставь 👍 и забирай 📚 Базу знаний
256
8
🤔 Из каких более важных компонентов состоит Compose? Compose состоит из компонентов: - Composable функции: описывают UI. - State: управляет состоянием компонентов. - Modifiers: применяются для настройки внешнего вида и поведения. - Layouts: определяют структуру расположения элементов на экране. - Recomposition: механизм обновления интерфейса при изменении состояния. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний
249
9
🤔 Какой класс можно использовать что бы ловить разные жесты? Чтобы обрабатывать жесты в Android, используйте класс GestureDetector. Он помогает отслеживать стандартные жесты: одиночные нажатия, свайпы, долгие нажатия, двойные касания и т.д. 🚩Как использовать GestureDetector? Создайте экземпляр GestureDetector, передав Context и слушателя (GestureDetector.OnGestureListener). Передавайте события касания в gestureDetector.onTouchEvent(event) из метода onTouchEvent(). class GestureActivity : AppCompatActivity(), GestureDetector.OnGestureListener { private lateinit var gestureDetector: GestureDetector override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) gestureDetector = GestureDetector(this, this) } override fun onTouchEvent(event: MotionEvent): Boolean { return gestureDetector.onTouchEvent(event) || super.onTouchEvent(event) } override fun onFling(e1: MotionEvent?, e2: MotionEvent?, velocityX: Float, velocityY: Float): Boolean { val deltaX = e2!!.x - e1!!.x if (deltaX > 0) Log.d("Gesture", "Swipe Right") else Log.d("Gesture", "Swipe Left") return true } override fun onDown(e: MotionEvent?) = true override fun onShowPress(e: MotionEvent?) {} override fun onSingleTapUp(e: MotionEvent?) = false override fun onScroll(e1: MotionEvent?, e2: MotionEvent?, distanceX: Float, distanceY: Float) = false override fun onLongPress(e: MotionEvent?) {} } Ставь 👍 и забирай 📚 Базу знаний
283
10
🤔 Какие преимущества Android перед другими ОС? Android предлагает открытую экосистему, гибкость в разработке, большое количество поддерживаемых устройств и мощный инструментарий. Также Android предоставляет свободу кастомизации UI и взаимодействие с низкоуровневыми возможностями системы. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний
282
11
🤔 Что делает библиотека LifeCycle ? Библиотека Lifecycle в Android Jetpack помогает управлять и контролировать жизненный цикл компонентов Android, таких как Activities и Fragments. Она упрощает создание компонентов, которые осведомлены о своем жизненном цикле и могут корректно реагировать на изменения в нем. Это позволяет избегать утечек памяти и некорректной работы компонентов при изменении конфигураций или переходах между состояниями. 🚩Основные компоненты библиотеки Lifecycle 🟠LifecycleOwner Это интерфейс, который определяет класс как владеющий жизненным циклом. Activity и Fragment уже реализуют этот интерфейс. class MyActivity : AppCompatActivity(), LifecycleOwner { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) } } 🟠LifecycleObserver Это интерфейс, который позволяет классу наблюдать за изменениями в жизненном цикле компонента. Методы, аннотированные @OnLifecycleEvent, будут вызываться при соответствующих событиях жизненного цикла. class MyObserver : LifecycleObserver { @OnLifecycleEvent(Lifecycle.Event.ON_START) fun onStart() { // Код, который выполняется при старте жизненного цикла Log.d("MyObserver", "onStart called") } @OnLifecycleEvent(Lifecycle.Event.ON_STOP) fun onStop() { // Код, который выполняется при остановке жизненного цикла Log.d("MyObserver", "onStop called") } } 🟠Lifecycle Это класс, который содержит информацию о текущем состоянии и позволяет другим объектам наблюдать за изменениями в жизненном цикле. class MyActivity : AppCompatActivity() { private lateinit var myObserver: MyObserver override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) myObserver = MyObserver() lifecycle.addObserver(myObserver) } } 🚩Применение библиотеки Lifecycle 1⃣ Добавьте зависимости в ваш build.gradle dependencies { implementation "androidx.lifecycle:lifecycle-extensions:2.2.0" } 2⃣Создайте класс, реализующий LifecycleObserver class MyObserver : LifecycleObserver { @OnLifecycleEvent(Lifecycle.Event.ON_RESUME) fun onResume() { Log.d("MyObserver", "Activity resumed") } @OnLifecycleEvent(Lifecycle.Event.ON_PAUSE) fun onPause() { Log.d("MyObserver", "Activity paused") } } 3⃣Добавьте LifecycleObserver в LifecycleOwner (например, Activity) class MyActivity : AppCompatActivity() { private lateinit var myObserver: MyObserver override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) myObserver = MyObserver() lifecycle.addObserver(myObserver) } } Ставь 👍 и забирай 📚 Базу знаний
285
12
🤔 После перебирания данных итератором, гарантируется ли очередность получения этих данных? Гарантируется только в том случае, если структура данных поддерживает порядок (например, List, LinkedList). Если коллекция неупорядоченная (например, HashSet, HashMap.keySet()), порядок может быть произвольным и не повторяться. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний
284
13
🤔 Можно ли создать анонимный класс внутри inline функции? Анонимный класс внутри inline-функции будет инстанцироваться при каждом вызове функции, что ломает цель inline — избавляться от накладных расходов на объекты. 🚩Что такое анонимный класс в Kotlin? Анонимный класс — это класс без имени, который можно создать с помощью object : Interface {}. interface ClickListener { fun onClick() } fun main() { val listener = object : ClickListener { override fun onClick() { println("Кнопка нажата!") } } listener.onClick() } 🚩Анонимный класс в `inline`-функции Если мы создадим анонимный класс внутри inline-функции, он будет создаваться каждый раз при вызове функции! inline fun setClickListener(action: () -> Unit) { val listener = object : ClickListener { override fun onClick() { action() } } listener.onClick() } fun main() { setClickListener { println("Нажато!") } } Ошибка компиляции Inline function cannot contain object expressions 🚩Как обойти ограничение? Если нужно использовать inline, можно передавать лямбду вместо анонимного класса. Рабочий вариант inline fun setClickListener(noinline action: () -> Unit): ClickListener { return object : ClickListener { override fun onClick() { action() } } } fun main() { val listener = setClickListener { println("Нажато!") } listener.onClick() } Ставь 👍 и забирай 📚 Базу знаний
304
14
Пожизненный PRO доступ на easyoffer — по цене одного года! До 2 сентября вы можете купить PRO навсегда. Покупаешь один раз — пользуешься всю жизнь. – База вопросов и задач из собеседований – Примеры видео-ответов на вопросы – Записи реальных собеседований – Тренажеры "Проработка вопросов" и "Реальное собеседование" – Аналитика требований из вакансий – Автоотклики на вакансии – Агрегатор вакансий (скоро) 👉 Купить PRO со скидкой 70%: https://easyoffer.ru/pro
251
15
🤔 Расскажи про data классы и sealed классы Data-классы в Kotlin предназначены для хранения данных и автоматически создают полезные методы, такие как `equals()`, `hashCode()`, `toString()`, а также методы для копирования объектов. Они удобны для представления сущностей с полями, которые нужно сравнивать, копировать или выводить, например, записи в базе данных. Sealed-классы (запечатанные классы) ограничивают наследование, позволяя создавать иерархии с фиксированным набором подклассов, что полезно для работы с типами, набор которых известен на этапе компиляции. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний
305
16
🤔 Расскажи подробно, что из себя представляет каждый компонент Аndroid-приложения? Android-приложение состоит из четырёх основных компонентов: Activity – UI-экран приложения. Service – фоновая работа без UI. BroadcastReceiver – слушает системные и пользовательские события. ContentProvider – делится данными между приложениями. 🚩`Activity` – экран приложения (UI) Отображает интерфейс пользователя. Обрабатывает взаимодействие (нажатия, свайпы, ввод текста). Управляется системой через жизненный цикл (Lifecycle). Пример Activity class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) // Загружаем XML-разметку } } 🚩`Service` – фоновая работа без UI Выполняет длительные фоновые задачи (музыка, загрузка файлов). Может работать даже если приложение закрыто. НЕ имеет UI (не рисует View). Пример Service class MyService : Service() { override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int { Thread { // Долгая фоновая задача }.start() return START_STICKY } override fun onBind(intent: Intent?): IBinder? = null } Запуск сервиса startService(Intent(this, MyService::class.java)) Остановка сервиса stopService(Intent(this, MyService::class.java)) 🚩`BroadcastReceiver` – обработка событий (системных и пользовательских) - Получает события системы (BOOT_COMPLETED, BATTERY_LOW). - Слушает события других приложений. - Может быть динамическим (через код) или статическим (AndroidManifest.xml). Пример BroadcastReceiver (отключение Wi-Fi) class NetworkReceiver : BroadcastReceiver() { override fun onReceive(context: Context, intent: Intent) { if (intent.action == ConnectivityManager.CONNECTIVITY_ACTION) { println("Сеть изменилась!") } } } Регистрируем BroadcastReceiver в AndroidManifest.xml <receiver android:name=".NetworkReceiver"> <intent-filter> <action android:name="android.net.conn.CONNECTIVITY_CHANGE"/> </intent-filter> </receiver> Можно зарегистрировать динамически в коде val receiver = NetworkReceiver() registerReceiver(receiver, IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION)) 🚩`ContentProvider` – обмен данными между приложениями - Дает доступ к данным *другим приложениям. - Позволяет безопасно работать с БД (Room, SQLite). - Используется для Contacts, MediaStore, Calendar. Пример ContentProvider (чтение контактов) val cursor = contentResolver.query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null) cursor?.use { while (it.moveToNext()) { val name = it.getString(it.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME)) println("Контакт: $name") } } Запрос данных через Uri val uri = Uri.parse("content://com.example.provider/table") contentResolver.query(uri, null, null, null, null) 🚩Как компоненты взаимодействуют между собой? Пример: Activity запускает Service через Intent startService(Intent(this, MyService::class.java)) Пример: Service отправляет Broadcast, а Receiver его ловит sendBroadcast(Intent("com.example.CUSTOM_EVENT")) Ставь 👍 и забирай 📚 Базу знаний
431
17
🤔 Что такое UI thread и Worker thread? 1. UI thread: - Основной поток приложения, где выполняются все операции с пользовательским интерфейсом. - Долгие операции здесь могут привести к замораживанию приложения. 2. Worker thread: - Фоновые потоки для выполнения долгих задач (например, обработки данных, запросов в сеть). - Обновление UI из фонового потока невозможно. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний
334
18
🤔 В чём отличие Dalvik Virtual Machine и ART(Android Run Time)? Dalvik Virtual Machine (DVM) и Android Runtime (ART) — это две среды выполнения для запуска Android-приложений. DVM использовалась в ранних версиях Android, в то время как ART пришла на замену DVM, начиная с Android 5.0 (Lollipop). Основное различие между ними заключается в способе выполнения кода и производительности. 🚩Основные отличия между Dalvik и ART 🟠Тип выполнения кода Dalvik Virtual Machine (DVM): Just-In-Time (JIT) компиляция Dalvik использует JIT-компиляцию (Just-In-Time), что означает, что код приложения компилируется в машинный код во время выполнения (runtime). Когда приложение запускается, DVM интерпретирует байт-код (.dex-файлы), а при необходимости компилирует часть кода "на лету" для повышения производительности. Этот подход требует дополнительных ресурсов во время работы приложения, что увеличивает задержки (лаг) при запуске и потребляет больше CPU и батареи. ART использует AOT-компиляцию (Ahead-Of-Time), которая компилирует весь код приложения в машинный код заранее — во время установки приложения. Это устраняет необходимость интерпретации и JIT-компиляции во время работы приложения, что снижает нагрузку на процессор и улучшает производительность. 🟠Производительность Dalvik (DVM): Поскольку JIT-компиляция происходит во время работы приложения, это создает дополнительную нагрузку на процессор и замедляет выполнение. Производительность ниже из-за частой интерпретации кода. ART: Благодаря AOT-компиляции приложения запускаются быстрее и работают плавнее. Потребление ресурсов (CPU, батарея) значительно ниже, поскольку интерпретация и компиляция кода уже выполнены на этапе установки. 🟠Ускорение запуска приложений Dalvik (DVM): Приложения запускаются медленнее, так как DVM интерпретирует код во время каждого запуска. ART: Приложения запускаются быстрее, так как код уже компилирован в машинный код на этапе установки. 🟠Потребление батареи Dalvik (DVM): Потребляет больше батареи из-за того, что JIT-компиляция выполняется постоянно во время работы приложения. ART: Более энергоэффективен, так как большая часть работы выполнена заранее, и процессор не нагружается так сильно. 🟠Время установки приложения Dalvik (DVM): Приложения устанавливаются быстрее, так как код не компилируется заранее. ART: Приложения устанавливаются медленнее, так как на этапе установки выполняется AOT-компиляция. Например, установка приложения в ART может занимать больше времени, чем в DVM, из-за компиляции кода. 🟠Память Dalvik (DVM): DVM использует меньше памяти на устройстве, так как код компилируется только во время работы приложения, и машинный код не сохраняется. ART: AOT-компиляция увеличивает размер приложения, так как компилированный машинный код сохраняется на устройстве. Это требует больше места в памяти. 🟠Отладка и инструменты Dalvik (DVM): Ограниченные возможности отладки, так как JIT-компиляция не предоставляет доступа к заранее оптимизированному коду. ART: ART позволяет разработчикам использовать более продвинутые инструменты отладки (например, профилирование исполнения) и лучше анализировать производительность приложений. 🟠Совместимость Dalvik (DVM): Dalvik был изначально разработан для устройств с ограниченными ресурсами (медленные процессоры, малый объем оперативной памяти). Приложения работали в основном в условиях ограниченного оборудования. ART: ART ориентирован на современные устройства с мощными процессорами и большим объемом памяти. Он лучше справляется с современными требованиями приложений. 🚩Пример различий 🟠На Dalvik (DVM): - Установка быстрая. - При запуске приложения DVM интерпретирует и компилирует код. Это требует времени и ресурсов. - Приложение может работать медленно из-за интерпретации кода в реальном времени. 🟠На ART: - Установка занимает больше времени, так как код компилируется сразу. - Запуск приложения быстрый, потому что код уже готов к исполнению. - Приложение работает плавно, так как отсутствует необходимость компиляции во время выполнения. Ставь 👍 и забирай 📚 Базу знаний
369
19
🤔 Как расшифровывается APK? APK — Android Package. Это архив (аналог .zip), содержащий: - Скомпилированный код (classes.dex) - Ресурсы (res, assets) - Манифест (AndroidManifest.xml) - Подпись Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний
386
20
🤔 Как запустить асинхронные операции в чистом Android? В Android существует несколько способов запуска асинхронных операций. Наиболее распространённые из них включают использование AsyncTask (хотя он уже устарел), HandlerThread, AsyncTaskLoader, ExecutorService и современные подходы с использованием Kotlin Coroutines и библиотеки WorkManager. 🟠AsyncTask (устаревший) AsyncTask был одним из первых инструментов для выполнения асинхронных задач, однако его использование сейчас не рекомендуется из-за проблем с управлением жизненным циклом и утечками памяти. private class MyAsyncTask extends AsyncTask<Void, Void, String> { @Override protected String doInBackground(Void... voids) { // Выполнение длительной операции return "Result"; } @Override protected void onPostExecute(String result) { // Обновление UI после завершения операции } } // Запуск new MyAsyncTask().execute(); 🟠HandlerThread HandlerThread — это удобный способ создания фонового потока с циклом обработки сообщений. HandlerThread handlerThread = new HandlerThread("MyHandlerThread"); handlerThread.start(); Handler handler = new Handler(handlerThread.getLooper()); handler.post(new Runnable() { @Override public void run() { // Выполнение длительной операции } }); 🟠ExecutorService ExecutorService из стандартной библиотеки Java предоставляет более гибкий способ управления потоками. ExecutorService executor = Executors.newSingleThreadExecutor(); executor.submit(new Runnable() { @Override public void run() { // Выполнение длительной операции } }); 🟠Kotlin Coroutines Корутины в Kotlin — это современный и мощный инструмент для асинхронного программирования. Они упрощают работу с асинхронными задачами и обеспечивают безопасность работы с UI. import kotlinx.coroutines.* fun performAsyncTask() { GlobalScope.launch(Dispatchers.IO) { // Выполнение длительной операции val result = longRunningTask() withContext(Dispatchers.Main) { // Обновление UI после завершения операции } } } suspend fun longRunningTask(): String { delay(1000) // Симуляция длительной операции return "Result" } 🟠WorkManager WorkManager — это библиотека для выполнения фоновых задач, которая обеспечивает выполнение задач даже после закрытия приложения или перезагрузки устройства. public class MyWorker extends Worker { public MyWorker(@NonNull Context context, @NonNull WorkerParameters params) { super(context, params); } @NonNull @Override public Result doWork() { // Выполнение длительной операции return Result.success(); } } // Запуск Worker WorkManager workManager = WorkManager.getInstance(context); OneTimeWorkRequest request = new OneTimeWorkRequest.Builder(MyWorker.class).build(); workManager.enqueue(request); 🟠RxJava RxJava — это библиотека для реактивного программирования, которая также может быть использована для выполнения асинхронных задач. import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers; import io.reactivex.rxjava3.core.Observable; import io.reactivex.rxjava3.schedulers.Schedulers; Observable.fromCallable(() -> { // Выполнение длительной операции return "Result"; }) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(result -> { // Обновление UI после завершения операции }); Ставь 👍 и забирай 📚 Базу знаний
405