и посмотреть медиа
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.
🤔 Как определить изменение скорости работы программы после наших действий? 🟠Profile GPU Rendering Этот инструмент показывает время, затраченное на отрисовку каждого кадра. Использование этого инструмента позволяет выявить "тяжелые" кадры и измерить улучшения после оптимизации. 1⃣Включите режим разработчика на устройстве. 2⃣Перейдите в "Настройки" -> "Для разработчиков". 3⃣Включите опцию "Profile GPU Rendering" и выберите "On screen as bars". 4⃣Запустите ваше приложение и наблюдайте за графиками. Зеленые линии указывают на время отрисовки, и ваша цель - оставаться ниже 16 мс (для 60 кадров в секунду). 🟠Android Profiler Предоставляет набор инструментов для анализа производительности приложения. 1⃣ Откройте Android Studio и запустите ваше приложение. 2⃣Перейдите в "View" -> "Tool Windows" -> "Profiler". 3⃣Выберите ваше устройство и запущенное приложение. 4⃣Используйте вкладки CPU, Memory, Network и Energy для анализа различных аспектов производительности. 5⃣Сравните данные до и после оптимизации. 🟠Benchmarking Создание и использование тестов производительности помогает количественно оценить улучшения. Вы можете использовать библиотеку Jetpack Benchmark для создания и выполнения тестов производительности. 🚩Пример использования Jetpack Benchmark: 1⃣Добавьте зависимости в build.gradle: dependencies { androidTestImplementation "androidx.benchmark:benchmark-junit4:1.1.0" androidTestImplementation "androidx.test:runner:1.3.0" androidTestImplementation "androidx.test:rules:1.3.0" } 2⃣Создайте класс теста: import androidx.benchmark.junit4.BenchmarkRule import androidx.test.ext.junit.runners.AndroidJUnit4 import org.junit.Rule import org.junit.Test import org.junit.runner.RunWith @RunWith(AndroidJUnit4::class) class ExampleBenchmark { @get:Rule val benchmarkRule = BenchmarkRule() @Test fun myFunctionBenchmark() { benchmarkRule.measureRepeated { // Вызов вашей функции или кода для тестирования производительности myFunction() } } } 🟠Logcat Используйте журналирование для измерения времени выполнения определенных операций. val startTime = System.currentTimeMillis() // Ваш код val endTime = System.currentTimeMillis() Log.d("Performance", "Время выполнения: ${endTime - startTime} мс") 🟠StrictMode StrictMode помогает обнаружить операции, которые могут замедлить работу приложения, такие как работа с сетью или базой данных в главном потоке. if (BuildConfig.DEBUG) { StrictMode.setThreadPolicy( StrictMode.ThreadPolicy.Builder() .detectAll() .penaltyLog() .build() ) StrictMode.setVmPolicy( StrictMode.VmPolicy.Builder() .detectAll() .penaltyLog() .build() ) } 🟠Systrace Systrace позволяет собирать и анализировать трассировки производительности системы, предоставляя детализированные данные о времени выполнения различных операций. 1⃣Включите режим разработчика на устройстве. 2⃣В "Настройки" -> "Для разработчиков" включите "Enable GPU Debug Layers". 3⃣Запустите команду adb shell am broadcast -a com.android.systemui.screenshot.ScreenshotService.ACTION_SYSTRACE. Ставь 👍 и забирай 📚 Базу знаний
Открыть канал и посмотреть медиа🤔 В чём измеряется производительность layout? Производительность измеряется в миллисекундах времени отрисовки (measure, layout, draw). Также учитывается количество операций пересчёта и перекомпоновки. В Jetpack Compose оценивается количеством recomposition и snapshot изменений. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний
Открыть канал и посмотреть медиа🤔 Зачем нужно разделять отображение и бизнес-логику? Разделение UI и бизнес-логики делает код понятнее, тестируемее и проще в поддержке. Это ключевой принцип чистой архитектуры (Clean Architecture) и паттернов MVP, MVVM, MVI. 🚩Что такое UI и бизнес-логика? Плохой код (UI + логика в Activity) class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) val button = findViewById(R.id.button) button.setOnClickListener { val result = fetchData() // ❌ Логика в UI button.text = result } } fun fetchData(): String { return "Данные с сервера" // ❌ Тут должна быть ViewModel } } 🚩Как правильно разделять UI и логику? (MVVM) Разделим код на Activity + ViewModel MainActivity (только UI) class MainActivity : AppCompatActivity() { private val viewModel: MainViewModel by viewModels() override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) val button = findViewById(R.id.button) viewModel.text.observe(this) { text -> button.text = text // ✅ UI обновляется из ViewModel } button.setOnClickListener { viewModel.loadData() // ✅ Вызываем бизнес-логику } } } MainViewModel (бизнес-логика) class MainViewModel : ViewModel() { private val _text = MutableLiveData() val text: LiveData = _text fun loadData() { _text.value = "Данные с сервера" // ✅ UI не знает, откуда данные } } Ставь 👍 и забирай 📚 Базу знаний
Открыть канал и посмотреть медиа🤔 Что значит android:exported="true" / "false"? - android:exported="true" — компонент (Activity, Service, Receiver) доступен извне (например, через интенты или deeplinks). - android:exported="false" — компонент может вызываться только внутри приложения. С Android 12 это поле обязательно для всех компонентов с intent-filter. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний
Открыть канал и посмотреть медиа🤔 Как сохранить состояние скролла при пересоздании Activity? При пересоздании Activity (например, при повороте экрана) состояние ScrollView или RecyclerView сбрасывается. Чтобы этого избежать, можно сохранить и восстановить позицию скролла. 🟠Использование `onSaveInstanceState()` Android позволяет сохранять данные в Bundle перед уничтожением Activity, а затем восстанавливать их. class MainActivity : AppCompatActivity() { private lateinit var scrollView: ScrollView override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) scrollView = findViewById(R.id.scrollView) // Восстанавливаем позицию скролла savedInstanceState?.let { val scrollY = it.getInt("scroll_position", 0) scrollView.post { scrollView.scrollTo(0, scrollY) } } } override fun onSaveInstanceState(outState: Bundle) { super.onSaveInstanceState(outState) outState.putInt("scroll_position", scrollView.scrollY) } } 🟠Для `RecyclerView` У RecyclerView уже есть встроенный механизм сохранения состояния через LinearLayoutManager. class MainActivity : AppCompatActivity() { private lateinit var recyclerView: RecyclerView private lateinit var layoutManager: LinearLayoutManager override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) layoutManager = LinearLayoutManager(this) recyclerView = findViewById(R.id.recyclerView) recyclerView.layoutManager = layoutManager recyclerView.adapter = MyAdapter() // Восстанавливаем позицию скролла savedInstanceState?.let { val scrollPosition = it.getInt("recycler_position", 0) recyclerView.post { layoutManager.scrollToPosition(scrollPosition) } } } override fun onSaveInstanceState(outState: Bundle) { super.onSaveInstanceState(outState) outState.putInt("recycler_position", layoutManager.findFirstVisibleItemPosition()) } } 🟠Использование `android:freezesText` для `EditText` Если EditText находится внутри ScrollView, можно включить android:freezesText="true", чтобы автоматически сохранять данные. Ставь 👍 и забирай 📚 Базу знаний
Открыть канал и посмотреть медиа🤔 Как преобразовать горячий поток в холодный в RxJava и наоборот? Горячий поток можно симулировать, используя Subject с несколькими подписчиками. Холодный поток можно создать заново или применить defer, чтобы каждый подписчик получал независимый поток. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний
Открыть канал и посмотреть медиа🤔 Как в Ретрофите в гет методе поставить атрибут в путь в контретом месте? В 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: Ссылка скрыта Ставь 👍 и забирай 📚 Базу знаний
Открыть канал и посмотреть медиа🤔 Откуда у Handler способность работать с главным потоком? Handler связан с Looper, который обрабатывает очередь сообщений. Главный поток имеет свой Looper, созданный автоматически при запуске приложения, и Handler, связанный с этим Looper, может отправлять сообщения в главный поток. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний
Открыть канал и посмотреть медиа🤔 Сколько типов инстансов у nothing? Nothing — это специальный bottom type (нижний тип), который означает: Функция никогда не возвращает результат (throw, error()). Код после Nothing недостижим. fun fail(): Nothing { throw IllegalStateException("Ошибка!") // Никогда не возвращает значение } 🚩Почему `Nothing` не имеет инстансов? Все классы в Kotlin могут иметь инстансы (объекты), кроме Nothing. Nothing нельзя создать (instantiate), потому что он не имеет конструктора. Любая переменная типа Nothing просто не существует. val x: Nothing = Nothing() // ❌ Ошибка: у Nothing нет конструктора 🚩Где используется `Nothing`? Используется в throw fun fail(): Nothing = throw IllegalArgumentException("Ошибка") Используется в TODO() fun getData(): String { TODO("Функция ещё не реализована") } Используется в if-else, где один вариант throw fun getValue(x: Int): String { return if (x > 0) "Позитивное число" else throw IllegalArgumentException("Отрицательное!") } Ставь 👍 и забирай 📚 Базу знаний
Открыть канал и посмотреть медиаOnly registered users can share their opinion.
Be the first to share your impression of this resource!