и посмотреть медиа
Kotlin | Interview Questions
и посмотреть медиа
Interview questions for Kotlin developers with answers.
Interview questions for Kotlin developers with answers.
AI bot for text-to-speech and voice cloning in Telegram. Create audio using neural network quickly and easily.
Kotlin interview questions: extensions, coroutines, collections. With code examples and explanations for Android and backend.
🤔 Что такое Factory Builder? Это паттерн, который комбинирует фабричный подход (создание объектов без указания конкретного класса) и билдер (пошаговая сборка). Позволяет гибко управлять созданием сложных объектов с опциями. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний
Открыть канал и посмотреть медиа🤔 Что такое софткод? Софткод (Softcode, Soft Coding) — это подход к программированию, при котором логика программы хранится в конфигурационных файлах, базе данных или других внешних источниках, а не жёстко (hardcoded) прописана в коде. 🚩Разница между Hardcode и Softcode Пример Hardcode (жёстко зашито в коде) val apiUrl = "Ссылка скрыта // ❌ Если URL изменится, надо менять код Пример Softcode (гибко через конфигурацию) val apiUrl = Config.get("api_url") // ✅ Загружается из настроек 🚩Где используется софткод? Конфигурационные файлы (config.json, .properties, .xml). База данных (логика, настройки, права пользователей). API и сервер (получение UI-элементов, бизнес-логики с сервера). Скриптовые языки (скрипты загружаются динамически). 🚩Примеры использования Softcode в Android Softcode через SharedPreferences (конфигурация в памяти) val sharedPrefs = context.getSharedPreferences("settings", Context.MODE_PRIVATE) val theme = sharedPrefs.getString("app_theme", "light") // ✅ Загружаем тему из настроек Softcode через remoteConfig (Firebase Remote Config) val minVersion = Firebase.remoteConfig.getInt("min_supported_version") Softcode через JSON-файл (читаем конфиг из assets) fun getConfigValue(context: Context, key: String): String { val json = context.assets.open("config.json").bufferedReader().use { it.readText() } val jsonObject = JSONObject(json) return jsonObject.getString(key) // ✅ Получаем значение из JSON } Ставь 👍 и забирай 📚 Базу знаний
Открыть канал и посмотреть медиа🤔 Когда происходит перегрузка при использовании inline-функций? Перегрузка может произойти при передаче функций с разным числом аргументов, noinline и crossinline, а также при компиляции в Java, где inline-функции превращаются в разные реализации. Коллизии имён могут быть причиной перегрузки. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний
Открыть канал и посмотреть медиа🤔 В чем разница между linked list и array list? Являются двумя различными типами коллекций, которые используются для хранения наборов данных. Основные различия между этими двумя структурами данных касаются их внутренней реализации, что влияет на производительность операций добавления, удаления и доступа к элементам. 🚩Внутренняя реализация 🟠ArrayList основан на динамическом массиве. Это позволяет обеспечить быстрый доступ к элементам по индексу, поскольку адрес каждого элемента в памяти может быть вычислен напрямую. Однако, поскольку внутренний массив имеет фиксированный размер, при его переполнении необходимо выделить массив большего размера и скопировать в него все элементы из старого массива, что делает операции добавления и удаления более затратными по времени, особенно для больших объемов данных. 🟠LinkedList основан на двусвязном списке элементов, где каждый элемент (узел) содержит данные и ссылки на предыдущий и следующий элементы в списке. Это обеспечивает высокую производительность операций вставки и удаления, поскольку требуется лишь изменить ссылки у соседних элементов, но доступ к элементам по индексу занимает больше времени, так как для этого нужно последовательно пройти от начала или конца списка до нужного элемента. 🚩Производительность: 🟠ArrayList Быстрый доступ к элементам по индексу. Медленные операции добавления и удаления элементов (особенно в начале и середине списка), так как может потребоваться сдвиг оставшейся части массива. 🟠LinkedList Быстрые операции вставки и удаления элементов, поскольку они требуют только изменения ссылок. Медленный доступ к элементам по индексу, так как для доступа к элементу необходимо пройти по списку. Ставь 👍 и забирай 📚 Базу знаний
Открыть канал и посмотреть медиа🤔 Если профайлер показывает тебе что какой-нибудь фрейм занял 120 миллисекунд, что это значит? Если профайлер показывает, что рендеринг какого-либо фрейма занял 120 миллисекунд, это означает, что этот фрейм выполнялся слишком долго, что приводит к фризам и лагам в пользовательском интерфейсе. 🚩Разбор проблемы 🟠Что значит "фрейм" в этом контексте? В Android интерфейс обновляется 60 раз в секунду (частота 60 FPS). Это значит, что каждый кадр (фрейм) должен рендериться не дольше 16,67 мс (1000 мс / 60 FPS). 🟠Почему 120 мс — это плохо? Если рендеринг кадра занимает 120 мс, то за это время устройство должно было бы нарисовать 7 кадров (120 / 16,67 ≈ 7). Однако оно успело обработать только один, что приводит к заметному подтормаживанию. 🟠Что может вызывать такие задержки? Тяжёлые вычисления в основном потоке (UI Thread) – например, сложные математические операции, работа с JSON, парсинг файлов. Долгие операции с рендерингом – сложные векторные изображения, перегруженные Canvas.draw() или анимации. Синхронные вызовы I/O (чтение файлов, базы данных, сети) – если, например, в onDraw() идёт обращение к диску или базе данных. Неоптимальный layout – глубокая иерархия ViewGroup, частые перерасчёты макетов (measure/layout). 🚩Как исправить? 🟠Перенести тяжёлые вычисления в фоновый поток Coroutines, Executors, WorkManager 🟠Использовать профайлер Android Studio для поиска "узких мест". 🟠Оптимизировать рендеринг избегать сложных onDraw(), использовать ViewStub, RecyclerView. 🟠Пересмотреть макет убрать ненужные ViewGroup, использовать ConstraintLayout. Ставь 👍 и забирай 📚 Базу знаний
Открыть канал и посмотреть медиа🤔 Перечислите маркерные интерфейс? Маркерные интерфейсы не содержат методов, но обозначают поведение объекта. Примеры в Java: - Serializable — объект можно сериализовать. - Cloneable — объект можно клонировать. - Remote — используется для удалённых вызовов. - RandomAccess — для коллекций с быстрым доступом по индексу. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний
Открыть канал и посмотреть медиа🤔 Как в Ретрофите в гет методе поставить атрибут в путь в контретом месте? В Retrofit, чтобы передать значение в определенное место URL-адреса для GET-запроса, нужно использовать аннотацию @Path. Эта аннотация позволяет заменить параметр в строке пути на значение, переданное в метод. 🚩Как работает `@Path`? 1. Внутри аннотации @GET вы указываете строку пути, содержащую плейсхолдеры в фигурных скобках ({}). 2. Аннотация @Path связывает переменную метода с плейсхолдером в URL. 3. Когда метод вызывается, значение переменной подставляется вместо плейсхолдера в URL. Допустим, у вас есть API с эндпоинтом Ссылка скрыта Настраиваем интерфейс Retrofit interface ApiService { @GET("users/{id}/details") suspend fun getUserDetails( @Path("id") userId: String ): Response } Теперь, когда вы вызываете этот метод, вы можете передать значение для id, и Retrofit автоматически подставит его в URL val apiService = retrofit.create(ApiService::class.java) suspend fun fetchUserDetails() { val userId = "123" // Пример значения val response = apiService.getUserDetails(userId) if (response.isSuccessful) { println("User details: ${response.body()}") } else { println("Error: ${response.errorBody()?.string()}") } } 🚩Дополнительные аспекты использования `@Path` 🟠Как работают несколько параметров? Вы можете использовать несколько плейсхолдеров в пути и связать их с несколькими параметрами с помощью @Path. Например: API-эндпоинт Ссылка скрыта Интерфейс Retrofit interface ApiService { @GET("users/{userId}/posts/{postId}") suspend fun getPostDetails( @Path("userId") userId: String, @Path("postId") postId: String ): Response } Вызов метода val response = apiService.getPostDetails("123", "456") // URL: Ссылка скрыта 🟠Что если переменная null или пустая? Если вы передаете null или пустую строку в @Path, это вызовет ошибку, так как Retrofit требует обязательного значения для всех параметров пути. Убедитесь, что передаваемое значение всегда валидно. 🟠Как избежать ошибок при форматировании? Если значение пути может содержать символы, требующие экранирования (например, пробелы, специальные символы), Retrofit автоматически обработает это с помощью кодировки URL. Это делает использование @Path безопасным. @GET("search/{query}") suspend fun search( @Path("query") searchQuery: String ): Response Если вы вызовете метод с поисковым запросом apiService.search("hello world!") // Retrofit закодирует URL: Ссылка скрыта Ставь 👍 и забирай 📚 Базу знаний
Открыть канал и посмотреть медиа🤔 Нужно запустить синхронный код и получить его результат. Как это будешь делать? Если внутри асинхронного контекста (например, suspend или coroutine), можно использовать: - withContext(Dispatchers.IO) { блок } — синхронно для асинхронного вызова. Если вне корутины — через: - runBlocking { блок } — для запуска корутин синхронно (например, в тестах). - Если обычный код — просто вызвать метод, который возвращает результат. Важно понимать контекст и избегать блокировок в UI. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний
Открыть канал и посмотреть медиа🤔 Почему могут пропадать пользовательские данные при повороте экрана? Пропадание пользовательских данных при повороте экрана в Android-приложениях является распространенной проблемой, связанной с тем, как Android управляет жизненным циклом активности. Когда устройство поворачивается, система уничтожает текущую активность и создает её заново, что приводит к потере данных, если они не были сохранены должным образом. 🚩Причины пропадания данных при повороте экрана 🟠Пересоздание активности 🟠Неправильное управление состоянием 🚩Способы предотвращения потери данных Сохранение состояния с помощью onSaveInstanceState и onRestoreInstanceState class MainActivity : AppCompatActivity() { private var userData: String? = null override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) if (savedInstanceState != null) { userData = savedInstanceState.getString("USER_DATA_KEY") // Восстановите данные в пользовательском интерфейсе } } override fun onSaveInstanceState(outState: Bundle) { super.onSaveInstanceState(outState) outState.putString("USER_DATA_KEY", userData) } override fun onRestoreInstanceState(savedInstanceState: Bundle) { super.onRestoreInstanceState(savedInstanceState) userData = savedInstanceState.getString("USER_DATA_KEY") // Восстановите данные в пользовательском интерфейсе } } Использование Retain Fragment. Этот метод сохраняет данные, используя фрагмент, который сохраняет своё состояние при пересоздании активности. class RetainFragment : Fragment() { var userData: String? = null override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) retainInstance = true } } class MainActivity : AppCompatActivity() { private lateinit var retainFragment: RetainFragment override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) val fragmentManager = supportFragmentManager retainFragment = fragmentManager.findFragmentByTag("RETAIN_FRAGMENT") as RetainFragment? ?: RetainFragment().also { fragmentManager.beginTransaction().add(it, "RETAIN_FRAGMENT").commit() } // Используйте данные из RetainFragment val userData = retainFragment.userData } } Использование SavedStateHandle в ViewModel class UserViewModel(savedStateHandle: SavedStateHandle) : ViewModel() { var userData: String? get() = savedStateHandle.get("USER_DATA_KEY") set(value) = savedStateHandle.set("USER_DATA_KEY", value) } class MainActivity : AppCompatActivity() { private lateinit var viewModel: UserViewModel override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) viewModel = ViewModelProvider(this, ViewModelProvider.NewInstanceFactory()).get(UserViewModel::class.java) // Используйте данные из ViewModel val userData = viewModel.userData } } Ставь 👍 и забирай 📚 Базу знаний
Открыть канал и посмотреть медиаOnly registered users can share their opinion.
Be the first to share your impression of this resource!