Kotlin | Вопросы собесов
2.57K subscribers
28 photos
961 links
Download Telegram
🤔 Каким образом ты выбираешь layout ?

Выбор макета для фрагмента осуществляется в методе onCreateView с помощью LayoutInflater
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?
): View? {
return inflater.inflate(R.layout.fragment_example, container, false)
}


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔3👍1
🤔 Расскажи, про какие структуры данных знаешь.

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

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥4
🤔 Какой layout выбрать для списка из большого количества элементов?

Для списка из большого количества элементов следует использовать RecyclerView. Это наиболее эффективный и рекомендуемый компонент для отображения больших данных в виде списка или сетки в Android.

🚩Почему именно его?

🟠Производительность
RecyclerView использует механизм повторного использования (рециклинга) элементов, что значительно повышает производительность при работе с большими наборами данных.

🟠Гибкость
Поддержка различных компоновок через LayoutManager (например, LinearLayoutManager, GridLayoutManager, StaggeredGridLayoutManager).

🟠Анимации
Простая интеграция анимаций для добавления, удаления и перемещения элементов.

🟠Декораторы
Возможность добавления специальных эффектов и декораций, таких как разделители и отступы.

🚩Пример использования

1⃣Добавьте RecyclerView в XML макет
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recyclerView"
android:layout_width="match_parent"
android:layout_height="match_parent"/>


2⃣Создайте адаптер для RecyclerView
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> {
private List<String> data;

public MyAdapter(List<String> data) {
this.data = data;
}

@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext())
.inflate(R.layout.list_item, parent, false);
return new ViewHolder(view);
}

@Override
public void onBindViewHolder(ViewHolder holder, int position) {
String item = data.get(position);
holder.textView.setText(item);
}

@Override
public int getItemCount() {
return data.size();
}

public static class ViewHolder extends RecyclerView.ViewHolder {
public TextView textView;

public ViewHolder(View view) {
super(view);
textView = view.findViewById(R.id.textView);
}
}
}


3⃣Настройте RecyclerView в Activity или Fragment
public class MyActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

RecyclerView recyclerView = findViewById(R.id.recyclerView);
recyclerView.setLayoutManager(new LinearLayoutManager(this));

List<String> data = new ArrayList<>();
for (int i = 0; i < 100; i++) {
data.add("Item " + i);
}

MyAdapter adapter = new MyAdapter(data);
recyclerView.setAdapter(adapter);
}
}


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5😁4
🤔 Что означает в Android-разработке подход Single Activity?

Single Activity — это архитектурный подход в Android, при котором используется одна активность (Activity) как единственный контейнер для всего пользовательского интерфейса приложения. Вместо множества активностей используются фрагменты (Fragments), которые управляют различными частями пользовательского интерфейса внутри этой единственной активности. Этот подход облегчает управление жизненным циклом и навигацию внутри приложения.

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥4
Forwarded from Идущий к IT
Твое резюме на HeadHunter — ОК, если ты видишь это.

HeadHunter сравнивает ключевые навыки в твоем резюме и в вакансии и в момент отклика отображает, насколько % ты соответствуешь требованиям.

Специальный бейджик «Подходит по навыкам на 100%» отображается, если соответствие составляет более 60%.

Если при просмотре вакансий ты видишь такой бейджик, это значит, что список навыков в твоем резюме качественно составлен.

Это важный параметр, так как рекрутерам чаще показываются резюме с лучшим соответствием.

О том, как правильно указывать ключевые навыки и оптимизировать свое резюме я уже рассказывал в этом видео
🤔 Что позволяет делать ItemDecoration ?

ItemDecoration в RecyclerView позволяет добавлять украшения (декорации) к элементам списка. Это может включать в себя отступы, разделительные линии, рамки и любые другие визуальные элементы, которые не являются частью содержимого элементов списка.

🚩Основные возможности

🟠Добавление отступов
Вы можете добавлять отступы (margin) между элементами списка, чтобы улучшить визуальное разделение.
🟠Рисование разделительных линий
Легко добавлять разделительные линии между элементами списка, что делает его более читаемым.
🟠Настройка фона для отдельных элементов
Позволяет рисовать фоновые элементы, такие как цветные блоки или изображения, за элементами списка.

🚩Пример использования `ItemDecoration`

Добавление разделительных линий между элементами
class DividerItemDecoration(context: Context) : RecyclerView.ItemDecoration() {

private val divider: Drawable? = ContextCompat.getDrawable(context, R.drawable.line_divider)

override fun onDrawOver(c: Canvas, parent: RecyclerView, state: RecyclerView.State) {
val left = parent.paddingLeft
val right = parent.width - parent.paddingRight

val childCount = parent.childCount
for (i in 0 until childCount - 1) {
val child = parent.getChildAt(i)
val params = child.layoutParams as RecyclerView.LayoutParams

val top = child.bottom + params.bottomMargin
val bottom = top + (divider?.intrinsicHeight ?: 0)

divider?.setBounds(left, top, right, bottom)
divider?.draw(c)
}
}
}


Применение ItemDecoration в RecyclerView
val recyclerView: RecyclerView = findViewById(R.id.recyclerView)
recyclerView.layoutManager = LinearLayoutManager(this)
recyclerView.adapter = MyAdapter(data)
recyclerView.addItemDecoration(DividerItemDecoration(this, LinearLayoutManager.VERTICAL))


Добавление отступов между элементами
class SpacesItemDecoration(private val space: Int) : RecyclerView.ItemDecoration() {

override fun getItemOffsets(outRect: Rect, view: View, parent: RecyclerView, state: RecyclerView.State) {
outRect.left = space
outRect.right = space
outRect.bottom = space

// Добавляем верхний отступ только для первого элемента, чтобы избежать двойного отступа между элементами
if (parent.getChildAdapterPosition(view) == 0) {
outRect.top = space
}
}
}


Применение SpacesItemDecoration в RecyclerView
val recyclerView: RecyclerView = findViewById(R.id.recyclerView)
recyclerView.layoutManager = LinearLayoutManager(this)
recyclerView.adapter = MyAdapter(data)
recyclerView.addItemDecoration(SpacesItemDecoration(16)) // 16 пикселей отступа


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2😁1
🤔 Расскажи data классы и sealed классы

`Data` классы в Kotlin предназначены для хранения данных и автоматически генерируют методы `equals()`, `hashCode()`, `toString()`, а также `copy()`, что упрощает работу с ними. `Sealed` классы представляют ограниченные иерархии наследования, где все возможные подклассы известны на этапе компиляции, что удобно для обработки фиксированных наборов типов. В сочетании, `data` и `sealed` классы помогают создавать типобезопасные и легко управляемые структуры данных, особенно для использования в `when` выражениях.

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6🔥2
🤔 Как в RecyclerView делаются анимации ?

DefaultItemAnimator для стандартных анимаций
recyclerView.setItemAnimator(new DefaultItemAnimator());


Custom ItemAnimator для пользовательских анимаций
public class CustomItemAnimator extends DefaultItemAnimator {
@Override
public boolean animateRemove(RecyclerView.ViewHolder holder) {
holder.itemView.animate().alpha(0).setDuration(300).start();
return super.animateRemove(holder);
}
}
recyclerView.setItemAnimator(new CustomItemAnimator());


Анимации в Adapter для анимаций элементов
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
holder.itemView.setAlpha(0);
holder.itemView.animate().alpha(1).setDuration(500).start();
}


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
1👍1👀1
🤔 Расскажи про data классы и sealed классы

Data-классы в Kotlin предназначены для хранения данных и автоматически создают полезные методы, такие как `equals()`, `hashCode()`, `toString()`, а также методы для копирования объектов. Они удобны для представления сущностей с полями, которые нужно сравнивать, копировать или выводить, например, записи в базе данных. Sealed-классы (запечатанные классы) ограничивают наследование, позволяя создавать иерархии с фиксированным набором подклассов, что полезно для работы с типами, набор которых известен на этапе компиляции.

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6🔥3
🤔 Как в Android можно сделать анимацию ?

🟠Property Animations
Используйте ObjectAnimator для анимации свойств объектов.
ObjectAnimator animation = ObjectAnimator.ofFloat(view, "translationX", 0f, 100f);
animation.setDuration(1000);
animation.start();


🟠View Animations
Используйте XML-анимации для представлений. XML-анимация (res/anim/slide_in.xml)
<translate xmlns:android="https://schemas.android.com/apk/res/android"
android:fromXDelta="100%p"
android:toXDelta="0"
android:duration="500" />


Применение анимации
Animation animation = AnimationUtils.loadAnimation(context, R.anim.slide_in);
view.startAnimation(animation);


🟠Drawable Animations
Используйте анимации кадров для изображений. Анимация кадров (res/drawable/animation.xml)
<animation-list xmlns:android="https://schemas.android.com/apk/res/android" android:oneshot="false">
<item android:drawable="@drawable/frame1" android:duration="50" />
<item android:drawable="@drawable/frame2" android:duration="50" />
</animation-list>


Применение анимации
ImageView imageView = findViewById(R.id.imageView);
imageView.setBackgroundResource(R.drawable.animation);
AnimationDrawable animationDrawable = (AnimationDrawable) imageView.getBackground();
animationDrawable.start();


🟠MotionLayout
Используйте MotionLayout для сложных анимаций. XML (res/layout/activity_main.xml)
<androidx.constraintlayout.motion.widget.MotionLayout
xmlns:android="https://schemas.android.com/apk/res/android"
xmlns:app="https://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layoutDescription="@xml/scene">
<ImageView
android:id="@+id/imageView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/image" />
</androidx.constraintlayout.motion.widget.MotionLayout>


MotionScene (res/xml/scene.xml)
<MotionScene xmlns:android="https://schemas.android.com/apk/res/android"
xmlns:app="https://schemas.android.com/apk/res-auto">
<Transition app:constraintSetStart="@+id/start" app:constraintSetEnd="@+id/end" app:duration="1000">
<OnSwipe app:dragDirection="dragUp" app:touchAnchorId="@+id/imageView" />
</Transition>
<ConstraintSet android:id="@+id/start">
<Constraint android:id="@+id/imageView" app:layout_constraintTop_toTopOf="parent" />
</ConstraintSet>
<ConstraintSet android:id="@+id/end">
<Constraint android:id="@+id/imageView" app:layout_constraintBottom_toBottomOf="parent" />
</ConstraintSet>
</MotionScene>


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4
🤔 В каком потоке запускается самый обычный сервис

Самый обычный сервис в Android запускается в основном (главном) потоке приложения. Это означает, что для операций, требующих длительного времени, необходимо запускать дополнительные потоки, чтобы не блокировать UI и не вызывать ANR (Application Not Responding). Для фоновых задач лучше использовать IntentService или управлять потоками вручную.

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4🔥1
🤔 Что такое Jetpack ?

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

🚩Основные компоненты Jetpack

🟠Foundation (Основы)
AppCompat: Обратная совместимость с более старыми версиями Android.
Android KTX: Расширения для упрощения написания кода на Kotlin.
Multidex: Поддержка многодексных APK.

🟠Architecture (Архитектура)
LiveData: Компонент для наблюдения за изменениями данных.
ViewModel: Управление данными UI с учётом жизненного цикла.
Room: Библиотека для работы с базой данных SQLite с использованием объектов.
WorkManager: Управление фоновыми задачами с учетом условий выполнения.

🟠Behavior (Поведение)
Navigation: Упрощает навигацию и управление фрагментами.
Paging: Загрузка данных постранично.
DataStore: Современная и более гибкая альтернатива SharedPreferences.
CameraX: Упрощение работы с камерой.

🟠UI (Пользовательский интерфейс):
RecyclerView: Эффективное отображение больших списков.
Fragment: Управление фрагментами.
ConstraintLayout: Современный способ создания гибких и сложных макетов.
Jetpack Compose: Современная декларативная библиотека для создания UI.

🚩Преимущества Jetpack

Ускоренная разработка
Jetpack снижает количество шаблонного кода, что ускоряет процесс разработки.
Поддержка лучших практик
Библиотеки Jetpack созданы с учётом лучших практик Android-разработки.
Совместимость
Многие библиотеки Jetpack поддерживают обратную совместимость, что позволяет использовать их на более старых версиях Android.
Обратная совместимость и обновления
Библиотеки обновляются через Google Play, что позволяет использовать последние версии без обновления всей системы.

// ViewModel class
class MyViewModel : ViewModel() {
private val _data = MutableLiveData<String>()
val data: LiveData<String> get() = _data

fun updateData(newData: String) {
_data.value = newData
}
}

// Fragment or Activity
class MyFragment : Fragment() {
private lateinit var viewModel: MyViewModel

override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
val view = inflater.inflate(R.layout.fragment_my, container, false)
viewModel = ViewModelProvider(this).get(MyViewModel::class.java)

viewModel.data.observe(viewLifecycleOwner, Observer { newData ->
// Обновление UI
})

return view
}
}


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3🔥1
🤔 Какие есть особенности использования Nothing в дженериках

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

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥7👍2
🤔 Какие библиотеки есть в Architecture Components ?

🟠ViewModel
Управляет данными UI с учётом жизненного цикла.
class MyViewModel : ViewModel() {
val data: MutableLiveData<String> = MutableLiveData()
}


🟠LiveData
Наблюдаемые данные, автоматически обновляющиеся при изменениях.
val data: LiveData<String> = viewModel.data
data.observe(this, Observer { value ->
// Обновление UI
})


🟠Room
Работа с базой данных SQLite.
@Entity
data class User(@PrimaryKey val uid: Int, val firstName: String?, val lastName: String?)

@Dao
interface UserDao {
@Query("SELECT * FROM user")
fun getAll(): List<User>

@Insert
fun insertAll(vararg users: User)
}

@Database(entities = [User::class], version = 1)
abstract class AppDatabase : RoomDatabase() {
abstract fun userDao(): UserDao
}


🟠WorkManager
Управление фоновыми задачами.
val uploadWorkRequest: WorkRequest = OneTimeWorkRequestBuilder<UploadWorker>().build()
WorkManager.getInstance(context).enqueue(uploadWorkRequest)


🟠Data Binding
Привязка данных к элементам UI.
<layout xmlns:android="https://schemas.android.com/apk/res/android">
<data>
<variable name="viewModel" type="com.example.MyViewModel" />
</data>
<LinearLayout android:layout_width="match_parent" android:layout_height="match_parent">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{viewModel.data}" />
</LinearLayout>
</layout>


🟠Paging
Постраничная загрузка данных.
val pager = Pager(PagingConfig(pageSize = 20)) {
UserPagingSource()
}.flow.cachedIn(viewModelScope)


🟠Navigation
Навигация между компонентами приложения.
<fragment
android:id="@+id/firstFragment"
android:name="com.example.FirstFragment">
<action
android:id="@+id/action_firstFragment_to_secondFragment"
app:destination="@id/secondFragment" />
</fragment>


🟠DataStore
Современное хранилище данных.
val dataStore: DataStore<Preferences> = context.createDataStore(name = "settings")
val exampleCounter = dataStore.data.map { preferences -> preferences[EXAMPLE_COUNTER] ?: 0 }


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5
🤔 Чем launch отличается от async/await

В Kotlin launch и async — это функции для запуска корутин, но они отличаются по назначению и возвращаемому значению. launch запускает корутину, но не возвращает результат, обычно используется для выполнения фоновой работы без ожидания результата, например, обновления UI. async, напротив, возвращает Deferred объект, который можно ожидать с помощью await, и предназначен для получения результата вычислений, что полезно для асинхронных операций с возвращаемым значением.

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥8👍3
🤔 Использовал Data Binding ?

Это библиотека в Android, которая позволяет связывать компоненты пользовательского интерфейса (UI) напрямую с источниками данных, снижая количество шаблонного кода.

1⃣Включите Data Binding в вашем проекте
Добавьте в файл build.gradle модуля
android {
...
viewBinding {
enabled = true
}
}


2⃣Создайте макет с использованием Data Binding
В макете XML добавьте корневой элемент <layout> и определите переменные данных:
<!-- res/layout/activity_main.xml -->
<layout xmlns:android="https://schemas.android.com/apk/res/android">
<data>
<variable
name="viewModel"
type="com.example.MyViewModel" />
</data>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:padding="16dp">

<TextView
android:id="@+id/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{viewModel.text}" />

<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="@{() -> viewModel.onButtonClick()}"
android:text="Click Me" />
</LinearLayout>
</layout>


3⃣Настройте ViewModel
Создайте ViewModel для управления данными:
// MyViewModel.kt
package com.example

import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel

class MyViewModel : ViewModel() {
private val _text = MutableLiveData("Hello, Data Binding!")
val text: LiveData<String> get() = _text

fun onButtonClick() {
_text.value = "Button Clicked!"
}
}


4⃣Настройте Activity
Инициализируйте Data Binding в вашей Activity и свяжите ViewModel с макетом:
// MainActivity.kt
package com.example

import android.os.Bundle
import androidx.activity.viewModels
import androidx.appcompat.app.AppCompatActivity
import androidx.databinding.DataBindingUtil
import com.example.databinding.ActivityMainBinding

class MainActivity : AppCompatActivity() {
private val viewModel: MyViewModel by viewModels()

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val binding: ActivityMainBinding = DataBindingUtil.setContentView(this, R.layout.activity_main)
binding.lifecycleOwner = this
binding.viewModel = viewModel
}
}


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
🤔 Расскажи, как существуют и к чему привязаны фрагменты в Activity

Фрагменты в Android существуют как отдельные компоненты, привязанные к Activity, и могут добавляться, удаляться или заменяться во время работы приложения. Они прикрепляются к Activity, которая управляет их жизненным циклом, и могут быть переиспользованы на разных экранах. Фрагменты зависят от Activity для доступа к контексту и других системных ресурсов, а их жизненный цикл синхронизирован с жизненным циклом Activity.

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2🔥2
🤔 Что делает библиотека 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)
}
}


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5🔥1
🤔 Бывают ли случаи, когда нельзя использовать inline?

Да, inline нельзя использовать, если функция содержит большие блоки кода или рекурсию, так как это увеличит размер скомпилированного кода. Также inline-функции не подходят для передачи или возврата лямбд, которые захватывают переменные из контекста. Это может привести к ошибкам или значительному увеличению потребления памяти.

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥11👍5
🤔 Как думаешь, почему решили создать библиотеку LifeCycle ?

🚩Причины

🟠Упростить управление жизненным циклом
Автоматически управлять изменениями состояния компонентов.
🟠Избежать утечек памяти
Удалять ненужные ссылки на объекты при уничтожении Activity или Fragment.
🟠Улучшить модульность и тестируемость
Разделить код на логические модули и облегчить тестирование.
🟠Поддерживать реактивное программирование
Интеграция с LiveData и ViewModel для реактивного подхода.
🟠Снизить шаблонный код
Уменьшить количество ручного кода для управления состояниями.

Без Lifecycle
public class MyActivity extends AppCompatActivity {
private MyAsyncTask myTask;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
myTask = new MyAsyncTask();
myTask.execute();
}
@Override
protected void onDestroy() {
super.onDestroy();
if (myTask != null) {
myTask.cancel(true);
}
}
private static class MyAsyncTask extends AsyncTask<Void, Void, Void> {
@Override
protected Void doInBackground(Void... voids) {
return null;
}
}
}


С Lifecycle
public class MyActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
getLifecycle().addObserver(new MyLifecycleObserver());
}

public class MyLifecycleObserver implements LifecycleObserver {
@OnLifecycleEvent(Lifecycle.Event.ON_START)
public void onStart() {
// Код запуска задач
}

@OnLifecycleEvent(Lifecycle.Event.ON_STOP)
public void onStop() {
// Код остановки задач
}
}
}


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2😁2