A ViewModel keeps your app data safe when the screen changes, like rotating your phone. It helps avoid losing information and keeps the app smooth.
Why ViewModel survives configuration changes in Android Kotlin
class MyViewModel : ViewModel() { // Your data and logic here } // In your Activity or Fragment val viewModel = ViewModelProvider(this).get(MyViewModel::class.java)
The ViewModel class is part of Android Jetpack libraries.
Use ViewModelProvider to get the ViewModel instance tied to the UI controller lifecycle.
class CounterViewModel : ViewModel() { var count = 0 }
val viewModel = ViewModelProvider(this).get(CounterViewModel::class.java) viewModel.count += 1
This app shows a number and a button. When you tap the button, the number goes up. If you rotate the phone, the number stays the same because the ViewModel keeps the count safe.
import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModelProvider import androidx.appcompat.app.AppCompatActivity import android.os.Bundle import android.widget.Button import android.widget.TextView class CounterViewModel : ViewModel() { var count = 0 } class MainActivity : AppCompatActivity() { private lateinit var viewModel: CounterViewModel override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) viewModel = ViewModelProvider(this).get(CounterViewModel::class.java) val textView = TextView(this).apply { text = "Count: ${viewModel.count}" textSize = 24f id = 1 } val button = Button(this).apply { text = "Increase Count" setOnClickListener { viewModel.count += 1 textView.text = "Count: ${viewModel.count}" } } val layout = android.widget.LinearLayout(this).apply { orientation = android.widget.LinearLayout.VERTICAL addView(textView) addView(button) } setContentView(layout) } }
ViewModel objects survive configuration changes like screen rotation but are cleared when the Activity or Fragment is finished.
Do not store UI elements or Context in ViewModel to avoid memory leaks.
ViewModel helps keep your app fast and user-friendly by saving data across changes.
ViewModel keeps data safe during screen rotations and other configuration changes.
It separates UI code from data logic for cleaner apps.
Use ViewModelProvider to get your ViewModel instance tied to your UI lifecycle.
Practice
ViewModel survive configuration changes like screen rotations in Android?Solution
Step 1: Understand ViewModel lifecycle
A ViewModel is designed to be tied to the lifecycle of an activity or fragment but survives configuration changes like rotations.Step 2: Why it survives configuration changes
When a configuration change happens, the activity is destroyed and recreated, but the ViewModel instance is retained and reused.Final Answer:
Because it is tied to the lifecycle of the activity or fragment and not recreated on configuration changes -> Option AQuick Check:
ViewModel lifecycle = survives config changes [OK]
- Thinking ViewModel saves data to disk automatically
- Confusing ViewModel with static variables
- Assuming ViewModel runs on a background thread
Solution
Step 1: Identify correct ViewModelProvider usage
The correct syntax to get a ViewModel instance is using ViewModelProvider with the activity or fragment as owner.Step 2: Check Kotlin syntax
UsingViewModelProvider(this).get(MyViewModel::class.java)is the standard way to get the ViewModel instance.Final Answer:
val model = ViewModelProvider(this).get(MyViewModel::class.java) -> Option CQuick Check:
ViewModelProvider(this).get() = correct syntax [OK]
- Instantiating ViewModel directly with constructor
- Using incorrect ViewModelProvider syntax
- Confusing ViewModel class with instance
class MyViewModel : ViewModel() {
var counter = 0
}
// In Activity
val model = ViewModelProvider(this).get(MyViewModel::class.java)
model.counter += 1
println(model.counter)Solution
Step 1: Understand ViewModel data retention
The ViewModel instance survives configuration changes, so its data likecounteris preserved.Step 2: Trace counter increment
On first launch, counter is 0, incremented to 1 and printed. After rotation, the same ViewModel instance is used, counter is 1, incremented to 2 and printed.Final Answer:
1 on first launch, then increments to 2 after rotation -> Option BQuick Check:
ViewModel retains data = increments preserved [OK]
- Assuming ViewModel resets on rotation
- Thinking counter always starts at 0
- Expecting an error due to rotation
class MyViewModel : ViewModel() {
var data = "Hello"
}
// In Activity
val model = MyViewModel()
println(model.data)Solution
Step 1: Identify ViewModel instantiation error
ViewModel must be obtained via ViewModelProvider to survive configuration changes, not created with constructor.Step 2: Explain consequence
Direct instantiation means a new ViewModel is created every time, losing data on rotation.Final Answer:
ViewModel should not be instantiated directly; use ViewModelProvider instead -> Option DQuick Check:
Use ViewModelProvider, not constructor [OK]
- Creating ViewModel with constructor
- Thinking private variables fix lifecycle issues
- Blaming println for errors
Solution
Step 1: Identify best practice for preserving UI data
ViewModel is designed to hold UI-related data that survives configuration changes like rotations.Step 2: Choose correct data handling method
Storing user input in a ViewModel property and updating it on input changes keeps data safe and avoids unnecessary disk operations.Final Answer:
Store user input in a ViewModel property and update it on every input change -> Option AQuick Check:
ViewModel holds UI data safely across rotations [OK]
- Using SharedPreferences for temporary UI data
- Using static variables which can cause leaks
- Recreating ViewModel loses data
Ready to prove it?
Pass the test and this pattern moves unknown
